有序数组求平方有序

博客提示内容要倒着来,但未明确具体对象。推测可能在信息技术操作中有倒序需求,如数据排序等。

注意要倒着来

 public static int[] sortedSquares(int[] nums) {

        int[] result = new int[nums.length];
        int index = nums.length - 1;
        int left = 0;
        int right = nums.length - 1;

        for (; left <= right; ) {
            if (nums[left] * nums[left] < nums[right] * nums[right]) {
                result[index] = nums[right] * nums[right];
                right--;
            } else {
                result[index] = nums[left] * nums[left];
                left++;
            }
            index--;
        }
        return result;

    }
    public static void main(String[] args) {
        int[] nums={-4,-1,0,3,10};
        sortedSquares(nums);
    }
### 方法概述 对于有序数组平方问题,常见的解决方法有两种:一种是基于暴力法的思想,即先计算每个元素的平方排序;另一种是利用双指针技术,在原数组的基础上通过比较两端数值大小来构建最终的结果。 以下是两种主要实现方式及其代码示例: --- #### 方法一:暴力解 该方法的核心思想是对原始数组中的每一个元素取其平方值并存入数组中,随后对该数组进行排序操作。这种方法的时间复杂度由两部分组成:遍历数组计算平方的操作 \(O(n)\),以及对结果数组进行排序的操作 \(O(n \log n)\)[^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]; } sort(nums.begin(), nums.end()); return nums; } }; ``` 上述代码实现了简单的暴力解逻辑。它首先修改输入数组 `nums` 的每一项为其对应的平方值,接着调用标准库函数 `sort()` 对整个数组排序。 --- #### 方法二:双指针优化 考虑到输入数组已经是非递减排列的特点,可以采用更高效的双指针策略解决问题。由于负数平方后会变为正数,因此最大值只会出现在数组的两端而非中间位置。具体做法是从数组两侧向中心移动两个指针,每次选取较大者放入结果数组对应的位置上,从而避免额外的排序开销。此方法时间复杂度仅为线性的 \(O(n)\)[^3]。 ```cpp class Solution { public: vector<int> sortedSquares(vector<int>& nums) { int n = nums.size(); vector<int> result(n); int left = 0, right = n - 1, pos = n - 1; while (left <= right){ if(abs(nums[left]) > abs(nums[right])){ result[pos--] = nums[left] * nums[left]; left++; }else{ result[pos--] = nums[right] * nums[right]; right--; } } return result; } }; ``` 这段代码展示了如何运用双指针技巧高效完成任务[^4]。初始化三个变量分别指向起始端(`left`)、终止端(`right`) 和目标存储索引 (`pos`) 。循环过程中不断对比当前左右边界绝对值得到较大的一方加入至输出列表末端直至全部处理完毕为止。 --- ### 总结 以上介绍了两种不同的解决方案用于应对“有序数组平方”这一经典编程挑战题型。前者易于理解但效率较低;后者则充分利用了已知条件降低了运算成本,适用于大规模数据场景下追性能最优的应用场合。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值