劍指 Offer 03. 數(shù)組中重復(fù)的數(shù)字
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xzktv1/
在一個(gè)長(zhǎng)度為 n 的數(shù)組 nums 里的所有數(shù)字都在 0~n-1 的范圍內(nèi)。數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾個(gè)數(shù)字重復(fù)了,也不知道每個(gè)數(shù)字重復(fù)了幾次。請(qǐng)找出數(shù)組中任意一個(gè)重復(fù)的數(shù)字。
- 思路 1 使用庫(kù)函數(shù)申請(qǐng)額外空間
使用 HashSet 來(lái)進(jìn)行處理,因?yàn)?HashSet 本身不允許出現(xiàn)重復(fù)元素,所以當(dāng)添加元素失敗或已經(jīng)包含該數(shù)字時(shí),則表示出現(xiàn)了重復(fù)元素,將其返回即可。
時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(n)
var findRepeatNumber = function(nums) {
var numsSet = new Set();
for(var num of nums){
if(numsSet.has(num)){
return num;
}else{
numsSet.add(num)
}
}
return false
};
- 思路 2 數(shù)組本身做哈希表,達(dá)到了節(jié)省空間的目的
時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
var findRepeatNumber = function(nums) {
for(var i = 0; i<nums.length ; i++){
while(nums[i] != i){
if(nums[i] == nums[nums[i]]){
return nums[i]
}
var tmp = nums[i];
nums[i] =nums[tmp];
nums[tmp] = tmp;
}
}
return false
};
劍指 Offer 04. 二維數(shù)組中的查找
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xz2hh7/
var findNumberIn2DArray = function(matrix, target) {
let col = matrix.length;
if(!col) return false
let row = matrix[0].length;
let i=col-1, j=0;
while(i>=0 && j<row){
if(matrix[i][j] == target){
return true;
}else if(matrix[i][j] > target){
i--;
}else{
j++;
}
}
return false;
};
劍指 Offer 05. 替換空格
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xz2cf5/
var replaceSpace = function(s) {
return s.split(' ').join('%20')
};
//數(shù)組
var replaceSpace = function(s) {
var res ='';
for(i = 0; i<s.length; i++){
if(s[i] == " "){
res += '%20';
} else{
res += s[i]
}
}
return res
};
劍指 Offer 06. 從尾到頭打印鏈表
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xs92sh/
- 方法一:reverse()
var reversePrint = function(head) {
var stack = [];
while(head != null){
stack.push(head.val);
head = head.next
}
//return stack.reverse()
};
- 方法二:棧(先進(jìn)后出,push+pop)
var reversePrint = function(head) {
var stack = [];
while(head != null){
stack.push(head.val);
head = head.next;
}
var res = [];
const len = stack.length; //需要初始stack的長(zhǎng)度
for(var i = 0; i< len; i++){
res.push(stack.pop()); //stack長(zhǎng)度會(huì)不斷變化
}
return res;
};
劍指 Offer 09. 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xz8cid/
var CQueue = function() {
this.stack1=[];
this.stack2 = [];
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
this.stack1.push(value)
};
/**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
if(this.stack2.length==0){
while(this.stack1.length != 0){
this.stack2.push(this.stack1.pop())
}
}
if(this.stack2.length==0){
return -1
}else {
return this.stack2.pop()
}
};
劍指 Offer 10- I. 斐波那契數(shù)列
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xslxpr/
寫(xiě)一個(gè)函數(shù),輸入 n ,求斐波那契(Fibonacci)數(shù)列的第 n 項(xiàng)。斐波那契數(shù)列的定義如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契數(shù)列由 0 和 1 開(kāi)始,之后的斐波那契數(shù)就是由之前的兩數(shù)相加而得出。
答案需要取模 1e9+7(1000000007),如計(jì)算初始結(jié)果為:1000000008,請(qǐng)返回 1。
var fib = function(n) {
let f0 = 0, f1 = 1, fn;
if(n<2){
return n
}
for(let i = 2; i<=n ;i++){
fn = (f0 + f1) % 1000000007;
f0 = f1;
f1 = fn;
}
return fn
};
劍指 Offer 17. 打印從 1 到最大的 n 位數(shù)
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xzvgc2/
var printNumbers = function(n) {
if(n==0){
return false;
}
let all = Math.pow(10,n);
// let all=1
// for(var i=0;i<n;i++){
// all = 10*all
// }
let arr = [];
for(var i=1;i<all;i++){
arr.push(i)
}
return arr;
};
劍指 Offer 18. 刪除鏈表的節(jié)點(diǎn)
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xz4mp2/
時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
var deleteNode = function(head, val) {
if(head == null){
return null;
}
if(head.val == val){
return head.next;
}
var left = head;
var cur = left.next
while(cur.val != val && cur.next!= null){
left=cur;
cur=cur.next;
}
if(cur != null){
left.next=cur.next
}
return head
};
劍指 Offer 21. 調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面
var exchange = function(nums) {
var a = [];
var b = [];
for(var i=0;i<nums.length;i++){
if (nums[i]%2==1){
a.push(nums[i])
}else{
b.push(nums[i])
}
}
return a.concat(b)
};
雙指針
var exchange = function(nums) {
let right = nums.length-1;
let left = 0;
let tmp;
while(left<right){
if(left<right &&(nums[right]%2) == 0 ){
right--;
}
if(left<right &&(nums[left]%2) == 1){
left++;
}
tmp = nums[left]
nums[left] = nums[right]
nums[right] = tmp
}
return nums
};
劍指 Offer 22. 鏈表中倒數(shù)第 k 個(gè)節(jié)點(diǎn)
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xzy5ei/
時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
var getKthFromEnd = function(head, k) {
var cur = head;
var post= head;
for(var i=0; i<k; i++){
cur = cur.next;
}
while(cur!=null){
cur = cur.next;
post = post.next
}
return post
};
劍指 Offer 24. 反轉(zhuǎn)鏈表
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xzccxg/
時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
var reverseList = function(head) {
var cur = null;
var pre = head;
while(pre!=null){
var tmp = pre.next;
pre.next = cur;
cur = pre;
pre = tmp;
}
return cur
};
劍指 Offer 25. 合并兩個(gè)排序的鏈表
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xzjkjj/
輸入兩個(gè)遞增排序的鏈表,合并這兩個(gè)鏈表并使新鏈表中的節(jié)點(diǎn)仍然是遞增排序的。O(m+n)
var mergeTwoLists = function(l1, l2) {
if(l2==null){
return l1
}
if(l1==null){
return l2
}
if(l1.val>l2.val){
l2.next = mergeTwoLists(l1,l2.next);
return l2
}else{
l1.next = mergeTwoLists(l2,l1.next);
return l1
}
};
劍指 Offer 27. 二叉樹(shù)的鏡像
- 時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(n)
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xsepg3/
例如輸入:
4
2 7
1 3 6 9
鏡像輸出:
4
7 2
9 6 3 1
輸入:root = [4,2,7,1,3,6,9]
輸出:[4,7,2,9,6,3,1]
var mirrorTree = function(root) {
let res = null;
if(root != null){
res =new TreeNode(root.val);
res.left = mirrorTree(root.right);
res.right = mirrorTree(root.left);
}
return res
};
劍指 Offer 28. 對(duì)稱的二叉樹(shù)
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xsrxq1/
- 時(shí)間復(fù)雜度:O(n)
var isSymmetric = function(root) {
if(root==null){
return true;
}
return dfs(root.left,root.right)
};
var dfs = function(t1, t2){
if(t1==null && t2==null) {return true}
if(t1==null|| t2==null) {return false}
if(t1.val != t2.val){return false}
return dfs(t1.left,t2.right) && dfs(t1.right,t2.left)
}
劍指 Offer 30. 包含 min 函數(shù)的棧
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xzqg03/
/**
* initialize your data structure here.
*/
var MinStack = function() {
this.stack1 = [];
this.stack2 = [];
};
/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
this.stack1.push(x);
if(this.stack2.length == 0 || this.stack2[this.stack2.length - 1] >= x) {
this.stack2.push(x);
}
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
if(this.stack1.pop() == this.stack2[this.stack2.length - 1]) {
this.stack2.pop();
}
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
return this.stack1[this.stack1.length - 1];
};
/**
* @return {number}
*/
MinStack.prototype.min = function() {
return this.stack2[this.stack2.length - 1];
};
/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(x)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.min()
*/
劍指 Offer 32 - I. 從上到下打印二叉樹(shù)
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xsnu0i/
例如:
給定二叉樹(shù): [3,9,20,null,null,15,7],
返回:[3,9,20,15,7]
var levelOrder = function(root) {
if(root == null){
return [];
}
let queue = [root];
let res = [];
while(queue.length != 0){
let node = queue.shift();
res.push(node.val);
if(node.left){
queue.push(node.left);
}
if(node.right){
queue.push(node.right);
}
}
return res
};
劍指 Offer 32 - II. 從上到下打印二叉樹(shù) II
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xswwvg/
從上到下按層打印二叉樹(shù),同一層的節(jié)點(diǎn)按從左到右的順序打印,每一層打印到一行。
給定二叉樹(shù): [3,9,20,null,null,15,7],
返回其層次遍歷結(jié)果:[[3],[9,20], [15,7]]
var levelOrder = function(root) {
if(root == null){
return [];
}
let queue = [root];
let res = [];
while(queue.length != 0){
let level = [];
let len = queue.length;
for(let i = 0; i < len; i++){
let node = queue.shift();
level.push(node.val);
if(node.left){
queue.push(node.left);
}
if(node.right){
queue.push(node.right);
}
}
res.push(level)
}
return res
};
劍指 Offer 32 - III. 從上到下打印二叉樹(shù) III
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xs0paj/
請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)按照之字形順序打印二叉樹(shù),即第一行按照從左到右的順序打印,第二層按照從右到左的順序打印,第三行再按照從左到右的順序打印,其他行以此類推。
例如:
給定二叉樹(shù): [3,9,20,null,null,15,7],
返回其層次遍歷結(jié)果:[[3],[20,9], [15,7]]
var levelOrder = function(root) {
if(root == null){
return [];
}
let queue = [root];
let res = [];
let flag = 1;
while(queue.length != 0){
let level = [];
let len = queue.length;
for(let i = 0; i < len; i++){
let node = queue.shift();
if(flag==1){
level.push(node.val);
}else{
level.unshift(node.val);
};
if(node.left){
queue.push(node.left);
}
if(node.right){
queue.push(node.right);
}
}
flag = -flag;
res.push(level)
}
return res
};
BFS 翻轉(zhuǎn)二叉樹(shù)(附)
var mirrorTree = function(root) {
if(root == null){
return []
}
let res = [];
let queue = [root];
while(queue.length != 0 ){
let node = queue.shift();
res.push(node.val);
if(node.right){
queue.push(node.right)
}
if(node.left){
queue.push(node.left)
}
}
return res
};
劍指 Offer 39. 數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的數(shù)字
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xz7dgg/
方法一:數(shù)組排序:首先將 nums 排序,由于該數(shù)字超過(guò)數(shù)組長(zhǎng)度的一半,所以數(shù)組的中間元素就是答案,時(shí)間復(fù)雜度為 O(nlogn)
var majorityElement = function(nums) {
nums.sort((a,b) => a-b)
return nums[parseInt(nums.length / 2 )]
}
方法一:哈希計(jì)數(shù):遍歷 nums 數(shù)組,將數(shù)字存在 HashMap 中,統(tǒng)計(jì)數(shù)字出現(xiàn)次數(shù),統(tǒng)計(jì)完成后再遍歷一次 HashMap,找到超過(guò)一半計(jì)數(shù)的數(shù)字,時(shí)間復(fù)雜度為 O(n)
摩爾投票:遍歷 nums 數(shù)組,使用 count 進(jìn)行計(jì)數(shù),記錄當(dāng)前出現(xiàn)的數(shù)字為 cur,如果遍歷到的 num 與 cur 相等,則 count 自增,否則自減,當(dāng)其減為 0 時(shí)則將 cur 修改為當(dāng)前遍歷的 num,通過(guò)增減抵消的方式,最終達(dá)到剩下的數(shù)字是結(jié)果的效果,時(shí)間復(fù)雜度為 O(n)
- 摩爾投票是最優(yōu)解法,時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
var majorityElement = function(nums) {
let cur ,count=0;
for(let i = 0; i<nums.length; i++){
if(count == 0){
cur = nums[i];
}
if(nums[i] == cur){
count++;
}else{
count--
}
}
return cur
}
劍指 Offer 40. 最小的k個(gè)數(shù)
- 題目:輸入整數(shù)數(shù)組 arr ,找出其中最小的 k 個(gè)數(shù)。例如,輸入4、5、1、6、2、7、3、8這8個(gè)數(shù)字,則最小的4個(gè)數(shù)字是1、2、3、4。
解法 1: 直接排序
思路和算法:對(duì)原數(shù)組從小到大排序后取出前 k個(gè)數(shù)即可。
var getLeastNumbers = function(arr, k) {
arr.sort((a,b)=>a-b)
var min=[]
for(var i=0;i<k;i++){
min.push(arr[i]);
}
return min
};
解法 2: 最大堆
解法 3: 基于快速排序的 partition
劍指 Offer 42. 連續(xù)子數(shù)組的最大和
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xsiyed/
輸入一個(gè)整型數(shù)組,數(shù)組里有正數(shù)也有負(fù)數(shù)。數(shù)組中的一個(gè)或連續(xù)多個(gè)整數(shù)組成一個(gè)子數(shù)組。求所有子數(shù)組的和的最大值。要求時(shí)間復(fù)雜度為O(n)。
var maxSubArray = function(nums) {
let res = nums[0]
for(let i = 1; i<nums.length ;i++){
if(nums[i-1]>0){
nums[i] += nums[i-1]
}else{
nums[i] = nums[i]
}
res = Math.max(res,nums[i])
}
return res
};
劍指 Offer 47. 禮物的最大價(jià)值
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xstkx3/
在一個(gè) m*n 的棋盤(pán)的每一格都放有一個(gè)禮物,每個(gè)禮物都有一定的價(jià)值(價(jià)值大于 0)。你可以從棋盤(pán)的左上角開(kāi)始拿格子里的禮物,并每次向右或者向下移動(dòng)一格、直到到達(dá)棋盤(pán)的右下角。給定一個(gè)棋盤(pán)及其上面的禮物的價(jià)值,請(qǐng)計(jì)算你最多能拿到多少價(jià)值的禮物?
var maxValue = function(grid) {
let col = grid.length;
let row = grid[0].length;
for(let i = 0; i<col ;i++){
for(let j = 0; j<row ; j++){
if(i >= 1 && j >= 1){
grid[i][j] += Math.max(grid[i-1][j],grid[i][j-1]);
}else if(i >= 1){
grid[i][j] += grid[i-1][j];
}else if(j >= 1){
grid[i][j] += grid[i][j-1];
}
}
}
return grid[col-1][row-1];
};
var maxValue = function(grid) {
let col = grid.length;
let row = grid[0].length;
for(let i = 0; i<col ;i++){
for(let j = 0; j<row ; j++){
if(i == 0 && j==0){
continue;
}else if(i == 0){
grid[i][j] += grid[i][j-1];
}else if(j==0){
grid[i][j] += grid[i-1][j];
}else {
grid[i][j] += Math.max(grid[i-1][j],grid[i][j-1]);
}
}
}
return grid[col-1][row-1];
};
劍指 Offer 50. 第一個(gè)只出現(xiàn)一次的字符
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xzzd25/
在字符串 s 中找出第一個(gè)只出現(xiàn)一次的字符。如果沒(méi)有,返回一個(gè)單空格。 s 只包含小寫(xiě)字母。
示例: s = "abaccdeff" ,返回 "b";
示例: s = "" , 返回 " "
- 思路: 首先遍歷字符串將每個(gè)字符串映射到固定的位置,并且該位置存儲(chǔ)字符串的出現(xiàn)次數(shù),然后再遍歷一次字符串,找到第一個(gè)只出現(xiàn)一次的字符
時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
var firstUniqChar = function(s) {
var maps = new Map();
for(var num of s){
maps.set(num, maps.has(num))
}
for(var num of s){
if(maps.get(num)==0){
return num;
}
}
return " "
};
劍指 Offer 52. 兩個(gè)鏈表的第一個(gè)公共節(jié)點(diǎn)
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xshucr/
使用兩個(gè)指針 node1,node2 分別指向兩個(gè)鏈表 headA,headB 的頭結(jié)點(diǎn),然后同時(shí)分別逐結(jié)點(diǎn)遍歷,
當(dāng) node1 到達(dá)鏈表 headA 的末尾時(shí),重新定位到鏈表 headB 的頭結(jié)點(diǎn);
當(dāng) node2 到達(dá)鏈表 headB 的末尾時(shí),重新定位到鏈表 headA 的頭結(jié)點(diǎn)。
這樣,當(dāng)它們相遇時(shí),所指向的結(jié)點(diǎn)就是第一個(gè)公共結(jié)點(diǎn)。
- 時(shí)間復(fù)雜度:O(M+N)。
- 空間復(fù)雜度:O(1)O(1)。
//(雙指針?lè)ǎ?var getIntersectionNode = function(headA, headB) {
let curA = headA;
let curB = headB;
while (curA != curB) {
curA = curA != null ? curA.next : headB;
curB = curB != null ? curB.next : headA;
}
return curA;
};
劍指 Offer 53 - II. 0~n-1中缺失的數(shù)字
解法 1: 遍歷
var missingNumber = function(nums) {
if(nums[i]==0){
return 1
}
for(var i=0;i<nums.length;i++){
if(nums[i]!=i){
return i
}
}
return nums.length
};
解法 2: 二分查找(有序數(shù)組都應(yīng)該想到二分查找)
var missingNumber = function(nums) {
let i = 0;
let j = nums.length-1;
while(i <= j){
let mid =parseInt((i + j) / 2)
if(nums[mid] == mid){
i = mid + 1;
}else{
j = mid - 1
}
}
return i
};
劍指 Offer 54. 二叉搜索樹(shù)的第 k 大節(jié)點(diǎn)
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xspy85/
- 時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
- 二叉搜索樹(shù):根節(jié)點(diǎn)的值大于其左子樹(shù)中任意一個(gè)節(jié)點(diǎn)的值,小于其右節(jié)點(diǎn)中任意一節(jié)點(diǎn)的值,這一規(guī)則適用于二叉查找樹(shù)中的每一個(gè)節(jié)點(diǎn)。
- 二叉搜索樹(shù)的【中序遍歷】為 【遞增序列】,易得二叉搜索樹(shù)的 【中序遍歷倒序】 為 【遞減序列】 。
因此,求 “二叉搜索樹(shù)第 k大的節(jié)點(diǎn)” 可轉(zhuǎn)化為求 “此樹(shù)的【中序遍歷倒序】的第 k 個(gè)節(jié)點(diǎn)”。 中序遍歷 為 “左、根、右” 順序,倒序就是“右、根、左” 。
時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
var nums;
var res;
var kthLargest = function(root, k) {
nums = k
dfs(root);
return res;
};
var dfs = function(root){
if(root == null){
return;
}
dfs(root.right);
if(nums == 0){
return
}
nums --;
if(nums==0){
res = root.val
}
dfs(root.left)
}
劍指 Offer 55 - I. 二叉樹(shù)的深度
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xsaki2/
- 時(shí)間復(fù)雜度:O(n),空間復(fù)雜度:O(1)
var maxDepth = function(root) {
if(root == null){
return 0
}
return Math.max(maxDepth(root.left),maxDepth(root.right))+1
};
劍指 Offer 57. 和為 s 的兩個(gè)數(shù)字
https://leetcode-cn.com/leetbook/read/illustrate-lcof/xzimqj/
輸入一個(gè)遞增排序的數(shù)組和一個(gè)數(shù)字s,在數(shù)組中查找兩個(gè)數(shù),使得它們的和正好是s。如果有多對(duì)數(shù)字的和等于s,則輸出任意一對(duì)即可。
思路:有序數(shù)組,雙指針
var twoSum = function(nums, target) {
var len = nums.length;
var left = 0;
var right = len-1;
var arr = []
for(var i = 0; i<len ;i++){
if(nums[left]+nums[right] == target){
// arr.push(nums[left]);
// arr.push(nums[right])
return [nums[left],nums[right]]
};
if(nums[left]+nums[right] > target){
right--
}
if(nums[left]+nums[right] < target){
left++
}
}
};
劍指 Offer 57 - II. 和為s的連續(xù)正數(shù)序列
題目描述:輸入一個(gè)正整數(shù)
target,輸出所有和為target的連續(xù)正整數(shù)序列(至少含有兩個(gè)數(shù))。
序列內(nèi)的數(shù)字由小到大排列,不同序列按照首個(gè)數(shù)字從小到大排列。
示例:輸入:target = 9;輸出:[[2,3,4],[4,5]]
方法:滑動(dòng)窗口
var findContinuousSequence = function(target) {
var i=1;
var j=1;
var sum = 0;
var res =[];
while(i<=parseInt(target/2)){
if (sum<target){
sum+=j;
j++;
}else if(sum>target){
sum -=i;
i++;
}else{
let arr =[];
for(let k=i;k<j;k++){
arr.push(k);
}
res.push(arr)
sum -=i;
i++;
}
}
return res;
};
劍指 Offer 61. 撲克牌中的順子
- 題目:從撲克牌中隨機(jī)抽5張牌,判斷是不是一個(gè)順子,即這5張牌是不是連續(xù)的。2~10為數(shù)字本身,A為1,J為11,Q為12,K為13,而大、小王為 0 ,可以看成任意數(shù)字。A 不能視為 14。
- 方法:排序 + 遍歷
- 思路:最大值-最小值<5,且沒(méi)有重復(fù)的數(shù)字。
var isStraight = function(nums) {
nums.sort((a,b) => a-b);
var len = nums.length;
var joker = 0;//判斷0的個(gè)數(shù)
for(var i = 0; i<len ;i++){
if(nums[i] === 0){
joker++
}else if(nums[i] == nums[i+1]){
return false
}
}
return (nums[len-1]-nums[joker] < 5) ? true :false // 最大值-最小值 <5
};
劍指 Offer 62. 圓圈中最后剩下的數(shù)字
- 題目:0,1,,n-1這n個(gè)數(shù)字排成一個(gè)圓圈,從數(shù)字0開(kāi)始,每次從這個(gè)圓圈里刪除第m個(gè)數(shù)字。求出這個(gè)圓圈里剩下的最后一個(gè)數(shù)字。
例如,0、1、2、3、4這5個(gè)數(shù)字組成一個(gè)圓圈,從數(shù)字0開(kāi)始每次刪除第3個(gè)數(shù)字,則刪除的前4個(gè)數(shù)字依次是2、0、4、1,因此最后剩下的數(shù)字是3。 - 題解:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/huan-ge-jiao-du-ju-li-jie-jue-yue-se-fu-huan-by-as/
1、遞歸
遞推公式:f(N,M) = ( f(N?1,M) + M ) % N
var lastRemaining = function(n, m) {
if(n==1){
return 0;
}
var res = lastRemaining(n-1,m)
return (res+m)%n
};
2、迭代實(shí)現(xiàn)
時(shí)間復(fù)雜度:O(n),需要求解的函數(shù)值有 n 個(gè)。
空間復(fù)雜度:O(1),只使用常數(shù)個(gè)變量。
var lastRemaining = function(n, m) {
if (n === 1) {
return 0;
}
var res = 0
for(var i=2;i<=n;i++){
res = (res+m)%i;
}
return res
};