代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

作者通过解决704题目的二分查找问题,复习了二分查找算法,理解了防止溢出的mid计算方式。在27题中,首先采用暴力解法,然后尝试双指针法,最终找到正确的交换元素方法。作者意识到需要提高对算法的理解和预先构思的重要性。
摘要由CSDN通过智能技术生成

704:

第一眼看到题目感觉不难,但是发现需要用到O(logn),有点忘记怎么写才会达到这一种runtime complexity。

根据704题目,去查什么是binary search,先看了Binary Search - Data Structure and Algorithm Tutorials - GeeksforGeeks

的讲解,理解了binary search是怎么操作的。

在尝试中,不断碰到Time Limit Exceeded的问题,一直在debug。后面发现还是对区间的定义不准确。重新读了第一种写法以后,发现当(nums[middle] > target)时,middle - 1是漏掉了。因为middle一定不是要寻找的target,所以从middle - 1 开始寻找。

学会新的找mid的方式 int mid = left + (right-left)/2,防止溢出

最后我又删掉了第一遍所写的code,重新写了一遍,重新回顾每一个点。

Code:

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        //last number index number
        int 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 if(nums[mid] > target){
                right = mid -1;
            }
        }
        return -1;
    }
}

总用时: 45min

27:

根据题目,先使用了暴力解法。用了两个for loop,成功。

Code: 

class Solution {
    public int removeElement(int[] nums, int val) {
        int size = nums.length;
        for(int i = 0; i<size; i++){
            if(nums[i] == val){
                for(int j = i+1; j<size; j++){
                    nums[j-1] = nums[j];
                }
                i--;
                size--;
            }
        }
        return size;
    }
}

然后学习如何使用双指针法,卡在第二个例子,总是output [0,1,0,0,3],4不见了。

Code:

class Solution {
    public int removeElement(int[] nums, int val) {
        //two pointers
        int size = nums.length;
        int i=0;
        for(int j=size-1; j>=0; j--){
            if(nums[i] != val){
                i++;
            }else if(nums[i] == val){
                if(nums[j] != val){
                    nums[i] = nums[j];
                }
                size--;
            }
        }
        return size;
    }
}

还不知道为什么错。

决定换一个思路,最后发现直接swap就好了。

Code:

class Solution {
    public int removeElement(int[] nums, int val) {
        //two pointers
        int i=0;
        for(int j=0; j<nums.length; j++){
            if(nums[j] != val){
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                i++;
            }
        }
        return i;
    }
}

27用时:1.5h

总结:

好久没有写代码,感觉对algorithm的理解非常生疏。习惯于上手就写,没有提前构思,总是边写边想。以后应该先构思,多画图去理解,不要试出来答案。而且感觉应该先理解透彻每一道题目的思路是什么再去写,对于算法的理解不够透彻,希望第二天能先理解再去写,过程比结果更重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值