day01数组基础_二分查找_移除元素

数组

注意点

*数组下标从0开始
*数组内存空间的地址是连续的
*数组元素不能删,只能覆盖

二分查找

前提

1.有序数组
2.数组中无重复元素

边界条件(区间定义)

1.[left,right]
*while(left <= right)要使用<=,因为left == right是有意义的
*if(nums[middle] > target) right要赋值为middle - 1,因为当前这个nums[middle]一定不是target

2.[left,right)
*while(left < right),使用<是因为left == right在区间[left,right)没有意义
*if(nums[middle] > target),right更新为middle,因为下一个查询区间不会去比较nums[middle]

力扣704.二分查找

第一想法

看到题目只清楚思路,知道left,right该怎么移动,并不知道怎么实现左闭右闭,左闭右开,也不清楚while里的循环条件。

看完题解

只看了视频,未看题解,视频已经讲的很清楚了,考虑清楚边界条件就简单了。

自己实现遇到的困难

因为while的循环条件没写对,导致超出时间限制了。

完整代码

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

力扣27.移除元素

第一想法

只想到暴力解法,数组是不可直接删除的只能覆盖。

自己实现遇到的困难

自己想的时候是用后一个覆盖前一个,当进行到最后一个元素时,不知道该怎么办了。

看完视频

一定要明白快慢指针代表的含义,自己手动模拟一遍。

完整代码

//暴力解法
class Solution {
    public int removeElement(int[] nums, int val) {
        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--;//覆盖后下标减1,数组长度也减1
                len--;
            }
        }
        return len;
    }
}
//双指针法
class Solution {
    public int removeElement(int[] nums, int val) {
        int slow=0;//slow指针是fast找到的新元素该赋予的下标值
        //int fast=0;//fast指针是找更新之后数组的元素,即不等于val的数组元素
        for(int fast=0;fast<nums.length;fast++){
            if(nums[fast]!=val){
                nums[slow++]=nums[fast];
            }
        }
        return slow;
    }
}

总结

1.数组只可覆盖不可删除;

2.二分查找的边界条件,是左闭右闭还是左闭右开,每一种的写法;

3.双指针法的快慢指针分别代表的含义。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值