力扣刷题笔记

二分查找


第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;
};
   ```

 

 

 

 

posted @ 2022-07-21 21:59  0-again  阅读(98)  评论(0)    收藏  举报