LeetCode977 有序数组的平方

前言

题目: 977.有序数组的平方
文档: 代码随想录------有序数组的平方
编程语言: C++
解题状态: 完成,暴力解题

思路

最简单的思路就是平方以后排序,其中平方的过程的时间复杂度为 O ( n ) O(n) O(n),整体的时间复杂度基本上取决于排序的时间复杂度。

其次还可以考虑双指针法。

代码

方法一: 暴力排序

这里我使用的排序法为时间复杂度 O ( n 2 ) O(n^2) O(n2)的选择排序法。

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( 1 ) O(1) O(1)
cpp 复制代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++) {
            nums[i] = nums[i] * nums[i];
        }

        // 选择排序
        for (int i = 0; i < nums.size(); i++) {
            int minIndex = i;
            for (int j = i; j < nums.size(); j++) {
                if (nums[j] < nums[minIndex]) minIndex = j;
            }
            swap(nums[i], nums[minIndex]);
        }

        return nums;
    }
};

方法二: 双指针法

数组其实是有序的, 只不过负数平方之后可能成为最大数了。

那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
cpp 复制代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k = nums.size() - 1;
        vector<int> result(nums.size(), 0);

        for (int i = 0, j = nums.size() - 1; i <= j;) {
            if (nums[i] * nums[i] > nums[j] * nums[j]) {
                result[k--] = nums[i] * nums[i];
                i++;
            } else {
                result[k--] = nums[j] * nums[j];
                j--;
            }
        }

        return result;
    }
};
相关推荐
会员源码网1 小时前
内存泄漏(如未关闭流、缓存无限增长)
算法
颜酱3 小时前
从0到1实现LFU缓存:思路拆解+代码落地
javascript·后端·算法
颜酱4 小时前
从0到1实现LRU缓存:思路拆解+代码落地
javascript·后端·算法
CoovallyAIHub21 小时前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub1 天前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github
CoovallyAIHub1 天前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
刀法如飞1 天前
程序员必须知道的核心算法思想
算法·编程开发·算法思想