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

704 二分查找

题目

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 链接:704.二分查找

思路

暴力解简单

二分查找也就简单的中分查找

代码

class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;
        int pos = -1;
        int low = 0;
        int high = n-1;
        int mid = 0;
        while(low<=high){
            mid = (low+high)/2;
            if (nums[mid] == target){
                pos = mid;
                break;
            }
            else if (nums[mid] > target){
                high = mid-1;
            }
            else{
                low = mid +1;
            }
        }
        return pos;
    }
}

过程

while循环,low<=high,第一时间写成了<;导致失败

总结

mid = (low + high ) / 2 可写成 mid = low + (high - low )/ 2 防止溢出,但是也就少一位

27 移除元素

题目

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

链接:27.移除元素

思路

双指针,调换位置

代码

class Solution {
    public int removeElement(int[] nums, int val) {
        int left = 0;
        int len = nums.length;
        if(len != 0 ){
            int right = len - 1;
            int s = 0;
            while ( nums[right] == val ){
                right--;
                len -- ;
                if( right == -1)break;
            }//此时,right要么 = -1 即nums为空, 要么right指向非val,nums不为空
            while ( left < right ){
                if (nums[left] == val){
                    nums[left] = nums[right];
                    len -- ;
                    right -- ;
                    while ( nums[right] == val ){
                    right--;
                    len -- ;
                    }
                }
                left++;
            }
        }
        return len;
    }
}

过程

开始是 high 初始没判断

先是 {1} 中找1,要考虑low 和high 的关系

然后又有个 空集 找 0 ,

然后发现不用调换位置,直接左=右即可,右边即使要处理也全是 val

只能在循环体内break

总结

找找数组题 考虑边界条件 的方法论。

好吧题解还没看,先打卡

今日总结

学习时长3h

emm又是摆烂的一天,明天一定!

就写了两道算法,哦新手村还写了四道,还剩两道

1480 一维数组的动态和  注意原地修改

1342 将数字变成 0 的操作次数 注意可以用二进制位运算
更进一步,操作次数 = 总位数-1(左移一次表示除以2)  +  “1”个数(1表示该位需要先减一)

1672 最富有客户的资产总量 查了一下怎么找二维数组长度
nums.length 即可表示
对于 nums[i][j] ,i = nums.length //i行 , j = nums[i].length //j列

412 Fizz Buzz
对于字符串  sur =‘’    为啥  sur += i  运行时长(2ms) 比sur = ‘ ’ + i  长?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值