数组--part 3--有序数组的平方(力扣977)

基本算法思想

实际上对于一个简单的有序数组的平方排序,我们第一印象肯定是暴力搜索,不论是自己写快排,还是调用STL当中的sort方法都是一个方法,这边也给出相关的算法实现。

//下面的实现过程也是最容易想到的,先计算后排序。
//时间复杂度也不高,O(n + nlogn) 也就是取决于快排
class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        for (int i = 0; i < A.size(); i++) {
            A[i] *= A[i];
        }
        sort(A.begin(), A.end()); // 快速排序
        return A;
    }
};

但这边也稍微介绍一下双指针法,进行处理这一部分的题目

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        int k = A.size() - 1;
        vector<int> result(A.size(), 0);
        for (int i = 0, j = A.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后要处理两个元素
            if (A[i] * A[i] < A[j] * A[j])  {
                result[k--] = A[j] * A[j];
                j--;
            }
            else {
                result[k--] = A[i] * A[i];
                i++;
            }
        }
        return result;
    }
};

时间复杂度由原本的O(nlogn)变成了O(n)实际上还是减少了挺多的,还是可以变换一下,不过关于代码的书写方式,也可以和下面leetcode 方式进行综合,形成自己习惯的书写方式。

leetcode 977 有序数组的平方

链接

实际上就需要理解一下上面的那些代码讲解。此题自然水到渠成。

AC-code

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        //分析题目,得到返回的是一个新的vector,且对于空间复杂度没有明确的要求,故采用新建一个vector进行方便的存储
        vector<int >current_nums(nums.size());
        int left_index = 0, right_index = nums.size() - 1;
        int all_size_tag = nums.size() - 1;
        int left = 0, right = 0;
        //好好理解一下这一些变量定义的原因,分别表示的是什么
        //下面判断的过程还是非常基础的双指针法。
        while (left_index <= right_index)
        {
            left = nums[left_index] * nums[left_index];
            right = nums[right_index] * nums[right_index];
            if (left > right)
            {
                current_nums[all_size_tag--] = left;
                left_index++;
            }
            else
            {
                current_nums[all_size_tag--] = right;
                right_index--;
            }
        }
        return current_nums;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值