704.二分查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var search = function (nums, target ) { let high = nums.length - 1 let low = 0 while (low <= high){ let mid = Math .floor ( (high - low) / 2 ) + low if (nums[mid] > target){ high = mid - 1 }else if (nums[mid] < target){ low = mid + 1 }else if (nums[mid] === target){ return mid } } return -1 };
27.移除元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var removeElement = function (nums, val ) { let slow = 0 ,fast = 0 ; for (fast = 0 ; fast < nums.length ; fast++ ){ if (nums[fast] != val){ nums[slow] = nums[fast] slow ++ } } return slow };
977.有序数组的平方
归并排序的应用(双指针)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 var sortedSquares = function (nums ) { let numsOk = [] let i = 0 for (let index = 0 ; index < nums.length ;index ++){ if (nums[index] > 0 ){ i = index break } } if (i === 0 ){ if (nums[0 ] > 0 ){ for (i ; i < nums.length ;i ++){ numsOk[i] = nums[i]*nums[i] } }else { for (i ; i < nums.length ;i ++){ numsOk[i] = nums[nums.length - 1 - i]*nums[nums.length - 1 - i] } } return numsOk } let numsLeft = [] ,numsRight = [] for (let m = 0 ;m < i;m ++){ numsLeft[m] = nums[i - m - 1 ] * nums[i - m - 1 ] } for (let n = 0 ;n < nums.length - i ; n++){ numsRight[n] = nums[n+i] * nums[n+i] } let m = 0 , n = 0 ,x = 0 ; while (m < numsLeft.length && n < numsRight.length ){ if (numsLeft[m] < numsRight[n]){ numsOk[x] = numsLeft[m] x ++ m ++ }else { numsOk[x] = numsRight[n] x ++ n ++ } } for (m;m < numsLeft.length ;m++){ numsOk.push (numsLeft[m]) } for (n;n < numsRight.length ;n++){ numsOk.push (numsRight[n]) } return numsOk };
209.长度最小的子数组
解法一:暴力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var minSubArrayLen = function (target, nums ) { let m = 0 ,n = 0 ,add = 0 ,length = 0 for (m ;m < nums.length ;m ++){ add = nums[m] n = m while (add < target && n < nums.length - 1 ){ add += nums[++ n] } if (add >= target){ length = length != 0 ? (length > (n - m + 1 ) ? (n - m + 1 ) : length) : (n - m + 1 ) } } return length };
解法二 :滑动窗口(注意时间复杂度),其实就是双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 var minSubArrayLen = function (target, nums ) { let start = end = 0 let sum = 0 let len = nums.length let ans = Infinity while (end < len){ sum += nums[end]; while (sum >= target) { ans = Math .min (ans, end - start + 1 ); sum -= nums[start]; start++; } end++; } return ans === Infinity ? 0 : ans };
59.螺旋矩阵
本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 var generateMatrix = function (n ) { let matrix = new Array (n).fill (0 ).map (() => new Array (n).fill (0 )); let k = 1 let top = 0 , buttom = n - 1 , left = 0 , right = n - 1 ; while (k < n * n + 1 ){ for (let j = left ; j < right + 1 ; j ++){ matrix[top][j] = k k ++ } top ++ for (let i = top; i < buttom + 1 ; i ++){ matrix[i][right] = k k ++ } right -- for (let j = right ; j > left - 1 ; j --){ matrix[buttom][j] = k k ++ } buttom -- for (let i = buttom; i > top - 1 ; i --){ matrix[i][left] = k k ++ } left ++ } return matrix };