代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素 ,977.有序数组的平方

704 二分查找

题目链接704. 二分查找 - 力扣(LeetCode)

这道题看到原数组是“有序”,就想着用二分法去做,时间复杂度为(logn)。做完一遍之后,不明白“左闭右开”的写法是什么意思,然后就去代码随想录那里去温习。个人总结一下“左闭右开”就是:取不到right指针。也就是说right初始化是数组边界下标+1;如果是更新right也是直接让它赋值为mid就好了(因为mid取不到)。表现为代码就是这样

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

整体而言比“左闭右闭”的代码更好看一点。

35.搜索插入位置

题目链接35. 搜索插入位置 - 力扣(LeetCode)

跟704区别不大,就是多了个插入位置的判断:

    //判断插入到哪里
        if(nums[mid]>target){
            return mid;
        }
        else{
            //大的元素往后插一个位置
            return mid+1;
        }

27. 移除元素

题目链接:27. 移除元素 - 力扣(LeetCode)

数组规模在100以内,可以用暴力方法O( n^{2}),但题干说 “k个元素以外留下什么并不重要”,那么我们就可以用双指针去处理。其中快指针是遍历原数组,慢指针是新数组的下标,两者都是从0开始找到合适的元素就赋值给慢指针并且更新慢指针即可。复杂度为O(n)。

977.有序数组的平方

题目链接:977. 有序数组的平方 - 力扣(LeetCode)

因为数组规模为10^{4}其实这道题也可以用最直观的“先平方,再排序”来做,最不济的冒泡排序复杂度也就是O(n^{2}),规模小于10^{9},也能过。但因为平方后的数组(如果有负数元素)变化的趋势是左右两端为大,中间逐渐小。两端我们就可以用两个指针,像归并排序一样,比较平方后的大小,并将大的元素赋值结果数组中。又因为我们是从大到小赋值,所以结果数组下标k也要从末端开始更新。复杂度为O(n^{2})

代码和示意图如下图所示。

图像来源出处:代码随想录

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值