leetcode 刷题记录
-
704. 二分查找
【思路】二分查找适用于已经排序好的数组并且没有重复元素(一旦有元素重复,二分查找返回的元素下标可能不是唯一的),二分查找重点在于明确边界条件,遵循循环不变量规则,定好区间之后就不能改变。当right = nums.length - 1
时,就是闭合区间,这时while (left <= right)
,并且right = middle - 1; left = middle +1
。当right = nums,length
时,就是闭开区间,这时while (left < right)
并且right = middle; left = middle +1
。闭合区间 [left, right]:
var search = function(nums, target) { // left, right, middle 均为下标 let middle, left = 0, right = nums.length - 1; while (left <= right) { middle = left + ((right - left) >> 1); if (nums[middle] > target) { right = middle - 1; } else if (nums[middle] < target) { left = middle + 1 } else { return middle } } return -1; };
闭开区间:
var search = function(nums, target) { // left, right, middle 均为下标 let middle, left = 0, right = nums.length; while (left < right) { middle = left + ((right - left) >> 1); if (nums[middle] > target) { right = middle; } else if (nums[middle] < target) { // 因为是左闭区间,所以计算左边下标时还需 +1; left = middle + 1; } else return middle; } return -1; };
-
27. 移除元素
【思路】数组中的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。可以套两层循环暴力解决,也可以使用双指针,一次循环解决。
- 【两层循环】第一层循环用来遍历数组,当前值与目标值相等时,第二层循环覆盖数组,把后一位下标的值赋给当前一位,当前下标(i)减 1,数组长度减 1。
- 【双指针】定义两个指针,一个快指针遍历元素,慢指针记录新数组的下标,当快指针判断当前下标的值与目标值不相等时,慢指针指向的下标的值被快指针指向的值覆盖并自增 1.var removeElement = function(nums, val) { // 双循环暴力解法 let len = nums.length; for (i = 0; i < nums.length; i++) { if (nums[i] == val) { for (j = i; j < nums.length; j++) { nums[j] = nums[j + 1]; } i--; len--; } } return len; };
var removeElement = function(nums, val) { // 双指针 let slow = 0; for (let i = 0; i < nums.length; i++) { if (nums[i] !== val) { nums[slow++] = nums[i]; } } return slow; };
-
35. 搜索插入位置
【思路】这题是在二分查找(704)的基础上又增加了插入位置的判断,仔细找规律就会发现无论什么情况下的插入位置,都是在右指针的右边,所以当数组中没有目标值时,直接返回右指针值 +1 即可。var searchInsert = function(nums, target) { let mid, left = 0, right = nums.length - 1; while (left <= right) { mid = left + ((right - left) >> 1); if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] < target) { left = mid +1; } else if (nums[mid] == target) { return mid; } } return right + 1; };
参考代码随想录:https://www.programmercarl.com/