代码随想录day01|704_二分查找、27_移除元素

数组理论基础

数组在内存中的存储形式——>数组是存放在连续内存空间中相同类型数据的集合

内存空间是连续的意味着删除某个元素,会需要移动其他元素的地址。

二维数组在C++语言下的存储是连续的,而在Java中则非连续

704、二分查找

力扣链接

二分查找的关键——>理解区间的定义(不变量),循环不变量规则

常见的二分查找区间分为:左闭右闭 ' [ ] ' 、左闭右开 ' [ ) '

个人初步碰到这道题,只知道暴力遍历

        //暴力遍历查找
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target) {
                return i;
            }
        }
        return -1;

左闭右闭题解

    public int search(int[] nums, int target) {
        /*二分查找(左闭右闭'[]')*/
        int left = 0;
        int right = nums.length -1;//保证right闭合
        while (left <= right) {
            int middle = (left + right) / 2;//取中位数
            if (nums[middle] > target) {//target在左区间内
                right = middle - 1;//middle值不需要再比对,区间变更为[left,middle-1]
            } else if (nums[middle] < target) {//target在右区间内
                left = middle + 1;//区间变更为[middle+1,right]
            } else {//hit the target
                return middle;
            }
        }
        //没有找到值
        return -1;
    }

个人在看了一遍解题思路之后,手撸代码,发现个人的一个疑问点:

if语句中,为什么是middle - 1 或者 middle + 1 ;

个人思考理解有以下几步关键点,

①if判断确认了target的所在区间——>

②排除了middle所在位置的元素——>

③middle - 1 作为新的右区间端点 / middle + 1作为新的左区间端点

27、移除元素

双指针解法:

模拟的是C++语言中的erase函数,时间复杂度为O(n)。

核心要点是两个指针代表的含义

fast——>快指针是寻找新数组里所需要的元素

slow——>新数组下标值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值