力扣刷题笔记
二分查找
第33题:搜索旋转排序数组
例题:
输入:nums = [4,5,6,7,0,1,2], target = 0 输出:4 输入:nums = [4,5,6,7,0,1,2], target = 3 输出:-1 输入:nums = [1], target = 0 输出:-1
思路
1. 该数组是递增,但是从未知的位置做了旋转,也就是说要分成2个部份
2个部份都是递增的,拿例一来看:[4,5,6,7],[0,1,2]
2. 先找左边递增的部份
``mid = Math.floor((left + right) / 2) ``, 左边的边界,也就是[left,mid]
但是要判断是否全是递增``nums[0] <= nums[mid]``,如果为真,则全是递增的一部分
判断``nums[0] <= target && nums[mid] > target``target是否在[left,mid]之间,如果为真,则让``right = mid - 1``否则``left = mid + 1``继续向后寻找.
3. 找右边边界
如果``nums[0] <= nums[mid]``判断为假,说明不全是递增,边界为[mid,right]
判断``nums[mid] < target && nums[nums.length - 1] >= target``,如果为真,则``left = mid + 1``,否则``right = mid - 1``,说明target在[left,mid]
var search = function(nums, target) {
let right = nums.length - 1;
let left = 0;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (nums[mid] == target) return mid;
if (nums[0] <= nums[mid]) {
if (nums[0] <= target && nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}else{
if(nums[mid] < target && nums[nums.length - 1] >= target){
left = mid + 1
}else{
right = mid - 1
}
}
}
return -1;
};
search([4, 5, 6, 7, 0, 1, 2], 0);
第209题:长度最小的子数组
```
例题:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 输入:target = 4, nums = [1,4,4] 输出:1 输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0 ```
**思路**
1. 题目要求是在不打乱给定的nums数组的前提下去找出长度最小的连续子数组(一开始没看清楚题目,以为只要找到长度最小的连续子数组就可以了,所以给他排了序)
2. 先声明2个变量同时指向当前数组的第一个位置,定以2个变量sum和ans分别来存储总和,和满足要求的连续子数组的长度的数组``let start = 0; let end = 0;let sum = 0; let ans = []``
3. 用2个while循环
1. 第一个while循环来遍历数组的长度,同时用来控制start的指针``while(start < nums.length){}``
2. 第二个while循环来控制end指针,start不变,sum去累加end,end一直向后移动,一直移动到,sum等于target或end超出num.length
``
while(sum < target && end < num.length){
sum += nums[end];
end++
}``
3. 跳出该循环,可能出现``sum >= target``,或者 ``end > num.length``
4. 所以判断当前的``sum >= target`` 就将连续的长度插入到ans中;``ans.push(end - start)``
5. 再将sum的值减去nums[start]的值;
4.代码:
``` var minSubArrayLen = function (target, nums) { let start = 0; let end = 0; let sum = 0; let ans = []; while (start < nums.length) { while (sum < target && end < nums.length) { sum += nums[end]; end++; } if (sum >= target) { ans.push(end - start); } sum -= nums[start]; start++; } return ans.length ? Math.min(...ans) : 0; }; ```

浙公网安备 33010602011771号