Day1 | 704二分查找&27移除元素

104 阅读2分钟

二分查找 LeetCode 704

题目链接:LeetCode 704 - 简单

思路

根据题意,是打算用二分查找的方式做的 有打算考虑区间问题,但是当时做的时候区间问题考虑混乱 看了代码随想录之后对区间有清晰的想法了 主要有两种做法:左闭右闭&左闭右开

左闭右开:

java
class Solution {
    public int search(int[] nums, int target) {
        int left = 0,right=nums.length;
        
        do{
            int mid =  left + ((right - left) >> 1);;
            if(nums[mid]<target){
                left = mid + 1;
            }else if(nums[mid]>target){
                right = mid;
            }else{
                return mid;
            }
        }while(left<right);

        return -1;
    }
}

左闭右闭:

java
class Solution {
    public int search(int[] nums, int target) {
        int left = 0,right=nums.length-1;
        
        do{
            int mid =  left + ((right - left) >> 1);;
            if(nums[mid]<target){
                left = mid + 1;
            }else if(nums[mid]>target){
                right = mid - 1;
            }else{
                return mid;
            }
        }while(left<=right);

        return -1;
    }
}

总结

  1. 使用 left + ((right - left) >> 1) 替换 left + ((right - left) / 2)
  2. 左闭右闭时,right应为num.length - 1,而在左闭右开时,right为num.length。

移除元素 LeetCode 27

题目链接:LeetCode 27 - 简单

思路

最开始的思路是返回一个新数组,但是由于题目中含有不适用额外数组空间,加上代码的返回值为int,因此放弃了该想法。然后就是考虑在移除元素的时候采用递归的方法,但是不符合其使用O(1)的额外空间原地修改数组。因此采用双指针的方式来进行。

双指针:

java
class Solution {
    public int removeElement(int[] nums, int val) {
        int n = nums.length;
        int left = 0,i = 0;
        for(;i < n; i++){
            if(nums[i] != val){
                nums[left]=nums[i];
                left++;
            }
        }
        return left;
    }
}

总结

  1. 大体上代码与思路情况都比较符合,代码可以简化或者让人更加看的懂,因此需要注意使用的变量名
  2. 代码随想录上采用了相向双指针法,可以参考学习。