leetcode 有序数组的平方

cpp 复制代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();
        vector<int> result(n);
        int k = nums.size()-1;
        int left = 0;
        int right = nums.size() - 1;
        
        while ( left <= right ) {
            if ( nums[left]*nums[left] >= nums[right]*nums[right] ) {
                result[k--] = nums[left]*nums[left];
                left++;
            } else {
                result[k--] = nums[right]*nums[right];
                right--;
            }
        }

        return result;
    }
};

思路类似于归并排序,我们需要首先注意到,距离零更远的数字,是平方更大的数字,换句话说,就是绝对值更大的数字,是平方更大的数字。我们这样做是一个线性的做法,如果我们按照绝对值排序,只要是基于比较的排序算法,时间复杂度的下界就是 O(nlogn)O(nlogn)O(nlogn) ,所以的话,我们需要更小的时间复杂度需要考虑不进行排序,考虑用双指针实现我们的需求。

左边的指针 left 从左边往右边扫描,右边的指针 right 从右边往左边扫描。计算对应的元素的平方,取较大者存入我们的结果向量 result ,然后我们是找到的最大的平方,所以的话,我们选择从最大的下标 nums.size()−1nums.size()-1nums.size()−1 开始减小,自减即可。扫描结束,我们的单调非降的向量 result 就完成了。

通过上面的步骤,可以在线性的时间内,把一个有序的数组,平方之后,仍然是有序的数组。双指针的优势非常明显。

相关推荐
happymaker062612 分钟前
LeetCodeHot100——盛水最多的容器
数据结构·算法·leetcode·双指针·hot100
像素猎人3 天前
洛谷题B3882:求回文数【双指针】
算法·双指针
量子炒饭大师9 天前
【优化算法】滑动窗口的「义体化」重构 ——【滑动窗口】何为滑动窗口?滑动窗口算法的核心目的是什么?
c++·算法·重构·优化算法·双指针·滑动窗口
Tisfy9 天前
LeetCode 2540.最小公共值:双指针(O(m+n))
算法·leetcode·题解·双指针
handler0113 天前
滑动窗口(同向双指针)算法:模板与例题解析
c语言·c++·笔记·算法·蓝桥杯·双指针·滑动窗口
量子炒饭大师20 天前
【优化算法】双指针算法的「义体化」重构 ——【双指针】双指针算法中的指针是如何定义的?如何使用它进行一些简单的算法?
c++·算法·重构·优化算法·双指针
量子炒饭大师23 天前
【优化算法:双指针算法刷题宝典】—— 三数之和
算法·优化算法·双指针·三数之和
qeen871 个月前
【算法笔记】双指针及其经典例题解析
c++·笔记·算法·双指针
李日灐2 个月前
【优选算法3】二分查找经典算法面试题
开发语言·c++·后端·算法·面试·二分查找·双指针
小肝一下2 个月前
每日两道力扣,day7
数据结构·c++·算法·leetcode·双指针·hot100·接雨水,四数之和