代码随想录刷题-day1

83 阅读2分钟

704二分查找

题目位置:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

“左闭右闭”方法

左闭右闭: 所谓左闭右闭,就是我们认为这个target始终存在于我们的区间范围内。

有以下几个关键代码节点:

  1. right=nums.length-1 //仍然是贯彻左闭右闭这个原则

  2. if语句中,left=mid+1 ; right=mid-1; //还是为了左闭右闭

具体代码实现如下:

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

”左闭右开“方法

左闭右开: 所谓左闭右开——即这个target如果存在的话,只会存在于left~right-1这个区间之内,而right一定是找不到target的

代码要点:

  1. right=nums.length; //此时就不能是length-1了,初始化时就必须“右开”

  2. if判断语句中,right=mid; //仍然是为了右开

具体代码

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

35.搜索插入位置

题目位置:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

这里考量的也是二分查找算法,如果target不存在于nums[]之中,个人认为使用左闭右开的算法简单一下,跳出循环的那个节点:left==right,就直接是需要插入的下标位置。

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

27.移除元素

题目具体位置力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

暴力解法

遍历一次整个数组,只要发现其中元素等于val,就将其后面的所有元素都往前挪一位。

具体代码如下:

class Solution {
    public int removeElement(int[] nums, int val) {
        if(nums.length==0)
            return 0;
        int len=nums.length;
        for(int i=0;i<len;i++){
            if(nums[i]==val){
                for(int j=i+1;j<len;j++){
                    nums[j-1]=nums[j];
                }
                i--;
                len--;
            }
        }
        return len;
    }
}

双指针法

快慢指针
class Solution {
    public int removeElement(int[] nums, int val) {
        if(nums.length==0)
            return 0;
        int left=0;
        int right=0;
        int len=nums.length;
        for(right=0;right<len;right++){
            if(nums[right]!=val){
                nums[left]=nums[right];
                left++;
            }
        }
        return left;
    }
}
相向指针
class Solution {
    public int removeElement(int[] nums, int val) {
        if(nums.length==0)
            return 0;
        int len=nums.length;
        int left=0;
        int right=len-1;
        while(right>=0 && nums[right]==val )
            right--;
        while(left<=right){
            if(nums[left]==val){
                int temp=nums[left];
                nums[left]=nums[right];
                nums[right]=temp;
            }
            left++;
            while(nums[right]==val && right>=0)
                right--;
        }
        return left;
    }

}