代码随想录第一天打卡|力扣 704. 二分查找,27. 移除元素

第一题

题目链接

第一眼想法

        一开始感觉挺简单的,然后因为原来写题都是用Python、C,很少用Java所以第一时间还在想这个int [] nums是Java里面八大基础数据类型能不能直接像arraylist一样获取数组长度吗,后来发现int []也是有lengh方法的

思路:

        Java采用了左闭右开的写法,Python采用了左闭右闭的写法,这里说一下左闭右闭,不管采用哪种方式,最重要的一点就在于考虑中间不变的梁,如果采用全闭的方式,那left,right都要是数组索引的范围内,所以right = len(nums)-1然后在while的条件里也仍然为left <= right

空间复杂度:          ,时间复杂度

Java

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

Python

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # 左闭右闭的方式
        left = 0
        right = len(nums)-1
        mid = (right-left)>>1
        while left <= right:
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid+1
            else:
                right = mid-1
            mid = left + ((right-left)>>1)
        return -1

本题收获

中间写python的左闭右闭的写法时候出现一直死循环,一步一步排查之后发现原来是因为mid = left + (right-left)>>1这句的执行顺序是先把left+(right-left)加一起之后再进行右移,对这个左移右移的执行顺序不了解

第二题:移除元素

题目链接s​​​​​​​sicon-default.png?t=N176https://leetcode.cn/problems/remove-element/submissions/

思路 

采用快慢双指针的方法,用快指针去寻找非val元素,找到之后填充到慢指针所指位置,然后慢指针再向后移动,慢指针指向的拥有是即将要更新的位置,但是这个位置的值是不是val是不确定的,如果是val,就算这时候是数组的最后一位,那么他最后的slow+=1也正好是最终的答案

Python代码

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow,fast = 0,0
        length = len(nums)
        while fast < length:
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HBF_777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值