算法练习Day1| ##### 704. 二分查找 27. 移除元素

#算法#二分查找#移除元素#leetcode#数组
今天是算法练习的第一天,本应该紧张激动,但是因为这两道题目之前都做过,跟单词书里面的“abandon”一样,比较熟悉了,所以感觉还算容易。

数组

平时用的比较多,虽然都是Java封装好的数据结构,但是对数组还是比较熟悉,就直接做题了。题目链接:第一章 数组part01

704. 二分查找

二分查找,首先是对已经排好序的数组可以用这个方法,非排序的就不能用此方法。我对二分法的朴素理解就是对半查询,以升序的数组为例,取中间的元素,如果中间的元素大于目标值target,那target肯定就在数组的左侧,中间元素小于target,则target就在数组的右侧。阶梯代码如下: 

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

第一次是失败了的,因为循环遍历的条件不对,没有取 = 的情况,导致部分用例会执行失败。

27.移除元素

这个题目很有意思,因为我印象中大学学C的时候老是黑板上经常说的就是数组的删除。这里按照卡尔的要求,用了暴力和双指针两种方法解决问题。 暴力破解,这里有个细节容易忽略,需要注意:我们在移除的时候,数组本身是变化的,需要做对应的梳理。 双指针的方法比较巧妙,我也是反复想了挺长时间,第一时间我是想到了左右指针,但是目前还没实现,按照卡尔大佬的思路来解决,看似没有删除但实际已经删除!具体代码(暴力解法跑完通过就注释了):

public int removeElement(int[] nums, int val) {
        if(null == nums) {
            return 0;
        }
        int length = nums.length;
        //violent solution
        // for(int i = 0; i < length; i++){
        //     if(nums[i] == val) {
        //         for(int j = i + 1; j < length; j++) {
        //             nums[j - 1] = nums[j];
        //         }
        //         i--;
        //         length--;
        //     }
        // }

        // two pointers solution
        int pre = 0;
        int cur = pre;
        for(; pre < length; pre++) {
            if(nums[pre] != val) {
                nums[cur] = nums[pre];
                cur++;
            }
        }
        return cur;
    }

整体感觉就是题目属于简单,但是有些细节还是很巧妙,其实这些点还是可以用到工作中的。双指针的题目设计都比较巧妙,后面的任务继续练习吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值