代码随想录算法训练营第一天|704. 二分查找、27. 移除元素

今日前置知识

数组前置知识

今日主要题目

704. 二分查找 - 力扣(LeetCode)

27. 移除元素 - 力扣(LeetCode)

主要学习网址

代码随想录

做题思路与具体代码

题目一:704.二分查找

做题思路一

左闭右闭:

1.左右边界left和right,分别初始取值0和数组长度-1,意味着left和right从一开始就可能是最终结果

2.循环条件是(left<=right)

3.不断取中间值middle(注意溢出情况)判断middle所在位置的值是否与目标值相同

4.如果middle所在位置的值>目标值,证明目标值在middle的右边,将左边界缩小到middle+1

(因为middle不是目标值所在的位置)

5.如果middle所在位置的值<目标值,证明目标值在middle的左边,将右边界缩小到middle-1

(因为middle不是目标值所在的位置)

6.如果middle所在位置的值=目标值,证明目标值就在middle所在的位置,直接返回

7.循环结束都没找到,那么直接返回-1

具体代码
class Solution {
    // 左闭右闭方法解答
    public int search(int[] nums, int target) {
        //   左右边界
           int left=0;
           int right=nums.length-1;
        //    循环条件  left<right
        //    此时left可能会取到我们想要的值
        //    此时right可能会取到我们所要的值
           while(left<=right){
            //    中间值时刻改变
            //这里为了防止溢出,写的是left+(right+left)>>1
            int middle=left+((right-left)>>1);
                if(nums[middle]==target){
            //        找到目标值
                    return middle;
                }
                else if(nums[middle]<target){
                    // 因为左闭右闭区间,left取值可能取到我们想要的值上的,中间值已经被排除,所以要+1
                    left=middle+1;
                }
                else if(nums[middle]>target){
                    // 因为左闭右闭区间,right取值可能取到我们想要的值上的,中间值已经被排除,所以要-1了
                    right=middle-1;
                }
           }
           return -1;
    }
}
做题思路二

左闭右开:

1.左右边界left和right,分别初始取值0和数组长度,意味着left从一开始就可能是最终结果,但是right从一开始就不可能是最终结果,因为right越界了

2.循环条件是(left<right),这里right不能与left相等

3.不断取中间值middle(注意溢出情况)判断middle所在位置的值是否与目标值相同

4.如果middle所在位置的值>目标值,证明目标值在middle的右边,将左边界缩小到middle+1

(因为middle不是目标值所在的位置)

5.如果middle所在位置的值<目标值,证明目标值在middle的左边,将右边界缩小到middle

(因为middle不是目标值所在的位置且right不可能是目标值所以可以等于middle)

6.如果middle所在位置的值=目标值,证明目标值就在middle所在的位置,直接返回

7.循环结束都没找到,那么直接返回-1

具体代码
class Solution {
    // 左闭右开方法解答
    public int search(int[] nums, int target) {
        //   左右边界
           int left=0;
           int right=nums.length;
        //    循环条件  left<right
        //    此时left可能会取到我们想要的值
        //    此时right不可能会取到我们所要的值
           while(left<right){
            //    中间值时刻改变
            //这里为了防止溢出,写的是left+(right+left)>>1
            int middle=left+((right-left)>>1);
                if(nums[middle]==target){
            //  找到目标值     
                    return middle;
                }
                else if(nums[middle]<target){
                    // 因为左闭右闭区间,left取值是不会取到中间值上的,所以要+1
                    left=middle+1;
                }
                else if(nums[middle]>target){
            //因为左闭右开区间,right取值不可能会取到我们想要的值上,所以是middle本身,因为middle已经被排除了
                    right=middle;
                }
           }
           return -1;
    }
}

题目二:27. 移除元素

做题思路

本题采用快慢指针的方法

1.定义快慢指针初始值均为0

2.for循环快指针往前走,遇到与目标值不同的值,则将该值赋给慢指针所在位置,实现覆盖的效果,慢指针的作用就是将与目标值不同的值从头覆盖掉原数组,然后慢指针每覆盖一次向前进一步

3.快指针也往前不断前进

4.最后返回慢指针的值,即新数组的长度

具体代码
class Solution {
    // 快慢指针方法
    public int removeElement(int[] nums, int val) {
            // 定义快慢指针
            int fast=0;
            int slow=0;
          for(;fast<nums.length;fast++){
            //   快指针所在位置的值是否与val不同
            if(nums[fast]!=val){
            //   如果不同,将不同的值覆盖掉慢指针所在位置的值
                nums[slow]=nums[fast];
            //   慢指针往前走
                slow++;
            }
          }
          //返回慢指针此时的值
          return slow;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值