刷题day1 二分查找、移除元素

1、数组理论

数组是存放在连续内存空间上的相同类型数据的集合。(一维连续)

数组内存空间的地址是连续的

数组的元素是不可以删除的,但是可以覆盖

二维数组在内存的空间地址不一定连续,这取决于不同的编程语言,不同编程语言的内存管理是不一样的,在c++中二维数组是连续分布的,但是在java中二维数组是不连续的

2、二分查找

主要是区分一下左闭右闭,和左闭又开,其实也没啥区别,只是一个右边范围的一个赋值的一个改变,还有while条件的改变

以下是左闭右闭版本:right赋值的时候是mid-1

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

    

再看以下是左闭右开版本:right赋值的时候是mid,因为mid的值本身就不包括,这是又是开区间的,所以索性直接right赋值mid

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

3、移除元素

思想核心是快慢指针,熟悉快慢指针,在开始的时候两个同时指向数组首位,之后判断是否是与给定的val值相等,如果不相等那么就将快指针后移一位之后执行for循环中的if条件,进行数组覆盖操作,慢指针在赋值完成之后就++,如果相等那么就是单单快指针向后移一位。

这里要注意因为在前几轮都是不相等的,所以快慢指针都是一起的,然后继续下一轮for循环,在相等的那一轮,那么就是两个指针都会指向此时这个等于val的位置,然后慢指针不动,快指针++,之后执行不相等的覆盖操作,最后这个返回慢指针的索引号是数组大小真的是一开始没有想到,但是最后你可以发现慢指针的位置是停留在已经将上一轮的值赋值完的位置上的,所以慢指针的索引位置就是返回新数组的长度。

具体代码如下

class solusion{
    public int move(int nums[],int val){
        int slowIndex = 0;
        for(int fastIndex = 0;fastIndex < nums.length;fastIndex++){
            if(nums[fastIndex] != val){
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值