代码随想录一刷-Day01

文章讲述了在LeetCode中的两道经典编程题——二分查找和移除元素。在二分查找中强调了边界条件和更新指针的细节处理,而在移除元素问题中,重点指出原地操作时快慢指针使用中的陷阱,特别是while循环条件的正确设定。这两题都涉及到了对数组操作和优化的时间复杂度与空间复杂度分析。
摘要由CSDN通过智能技术生成

代码随想录一刷-Day01

LeetCode704. 二分查找

这道属于是入门必刷了,但是虽然能做出来,在细节上还是不够注意

public int search(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }

        int left = 0, right = nums.length - 1;

        while (left <= right) {
            int mid = (left + (right - left) / 2);
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return -1;
    }

首先如果右边界取 数组长度-1,则循环跳出的条件应该是左边界小于等于右边界

其次,在循环内,不符合条件要将左/右边界下标赋值给 mid 时,需要取 left = mid + 1right = mid - 1,否则可能导致死循环

这是细节问题,其他倒没什么值得关注的地方了

时间复杂度:O(log n)
空间复杂度:O(1)


LeetCode27. 移除元素

题目要求原地移除,对数组进行原地操作首先要想到的就是快慢指针

不过做题时仍然是对细节不够注意,起初我写出来的是:

public int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0) {
            return 0;
        }

        int slow = 0, fast = 0;
        while (fast < nums.length - 1) {
            if (nums[fast] != val) {
                nums[slow++] = nums[fast++];
            } else {
                fast++;
            }
        }

        return slow;
    }

提交后示例不通过,当 nums 长度为 1 时,数组长度始终为 0

起初我没有进行 Debug,自以为是地认为就是在 if-else 中出现的问题,结果实际上是在 while 的循环条件中,快指针没有用小于等于

最后只要改成 fast <= nums.length - 1 就可以了

最终正确的 code:

public int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0) {
            return 0;
        }

        int slow = 0, fast = 0;
        while (fast <= nums.length - 1) {
            if (nums[fast] != val) {
                nums[slow++] = nums[fast++];
            } else {
                fast++;
            }
        }

        return slow;
    }

时间复杂度:O(n)
空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值