leetcode 刷题记录 day1

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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值