首页 > 其他分享 >977_有序数组的平方

977_有序数组的平方

时间:2024-09-19 20:03:50浏览次数:10  
标签:977 平方 right nums int 数组 指针

977_有序数组的平方

【问题描述】

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例一:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例二:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

【算法设计思想】

在本题中,利用双指针法可以高效地解决这个问题。由于输入数组已经按非递减顺序排序,因此最大的平方值只会出现在数组的两端(即最小的负数的平方或最大的正数的平方)。

【算法描述】

C++:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();  // 获取数组的长度
        int left = 0;         // 初始化左指针,指向数组的起始位置
        int right = n - 1;    // 初始化右指针,指向数组的结束位置
        int pos = n - 1;      // 初始化结果数组的当前位置,从最后一个位置开始
        vector<int> result(n, -1);  // 初始化结果数组,大小与输入数组相同,初始值为 -1

        while (left <= right) {  // 当左指针小于等于右指针时,继续循环
            if (nums[left] * nums[left] >= nums[right] * nums[right]) {
                // 如果左指针所指元素的平方大于或等于右指针所指元素的平方
                result[pos] = nums[left] * nums[left];  // 将左指针所指元素的平方值放入结果数组的当前位置
                left++;  // 左指针向右移动一位
            } else {
                // 如果右指针所指元素的平方大于左指针所指元素的平方
                result[pos] = nums[right] * nums[right];  // 将右指针所指元素的平方值放入结果数组的当前位置
                right--;  // 右指针向左移动一位
            }
            pos--;  // 结果数组的当前位置向前移动一位
        }

        return result;  // 返回结果数组
    }
};

Java:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int n = nums.length;  // 获取数组的长度
        int left = 0;         // 初始化左指针,指向数组的起始位置
        int right = n - 1;    // 初始化右指针,指向数组的结束位置
        int pos = n - 1;      // 初始化结果数组的当前位置,从最后一个位置开始
        int[] result = new int[n];  // 初始化结果数组,大小与输入数组相同

        while (left <= right) {  // 当左指针小于等于右指针时,继续循环
            if (nums[left] * nums[left] >= nums[right] * nums[right]) {
                // 如果左指针所指元素的平方大于或等于右指针所指元素的平方
                result[pos] = nums[left] * nums[left];  // 将左指针所指元素的平方值放入结果数组的当前位置
                left++;  // 左指针向右移动一位
            } else {
                // 如果右指针所指元素的平方大于左指针所指元素的平方
                result[pos] = nums[right] * nums[right];  // 将右指针所指元素的平方值放入结果数组的当前位置
                right--;  // 右指针向左移动一位
            }
            pos--;  // 结果数组的当前位置向前移动一位
        }

        return result;  // 返回结果数组
    }
}

Python:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        n = len(nums)  # 获取数组的长度
        left = 0  # 初始化左指针,指向数组的起始位置
        right = n - 1  # 初始化右指针,指向数组的结束位置
        pos = n - 1  # 初始化结果数组的当前位置,从最后一个位置开始
        result = [-1] * n  # 初始化结果数组,大小与输入数组相同,初始值为 -1

        while left <= right:  # 当左指针小于等于右指针时,继续循环
            left_square = nums[left] ** 2  # 计算左指针所指元素的平方
            right_square = nums[right] ** 2  # 计算右指针所指元素的平方

            if left_square >= right_square:
                # 如果左指针所指元素的平方大于或等于右指针所指元素的平方
                result[pos] = left_square  # 将左指针所指元素的平方值放入结果数组的当前位置
                left += 1  # 左指针向右移动一位
            else:
                # 如果右指针所指元素的平方大于左指针所指元素的平方
                result[pos] = right_square  # 将右指针所指元素的平方值放入结果数组的当前位置
                right -= 1  # 右指针向左移动一位

            pos -= 1  # 结果数组的当前位置向前移动一位

        return result  # 返回结果数组

C:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
    int left = 0;  // 初始化左指针,指向数组的起始位置
    int right = numsSize - 1;  // 初始化右指针,指向数组的结束位置
    int pos = numsSize - 1;  // 初始化结果数组的当前位置,从最后一个位置开始

    // 动态分配结果数组的内存
    int* result = (int*)malloc(numsSize * sizeof(int));
    if (result == NULL) {
        // 内存分配失败,返回 NULL 并设置 returnSize 为 0
        *returnSize = 0;
        return NULL;
    }

    while (left <= right) {  // 当左指针小于等于右指针时,继续循环
        int leftSquare = nums[left] * nums[left];  // 计算左指针所指元素的平方
        int rightSquare = nums[right] * nums[right];  // 计算右指针所指元素的平方

        if (leftSquare >= rightSquare) {
            // 如果左指针所指元素的平方大于或等于右指针所指元素的平方
            result[pos] = leftSquare;  // 将左指针所指元素的平方值放入结果数组的当前位置
            left++;  // 左指针向右移动一位
        } else {
            // 如果右指针所指元素的平方大于左指针所指元素的平方
            result[pos] = rightSquare;  // 将右指针所指元素的平方值放入结果数组的当前位置
            right--;  // 右指针向左移动一位
        }
        pos--;  // 结果数组的当前位置向前移动一位
    }

    *returnSize = numsSize;  // 设置返回数组的大小
    return result;  // 返回结果数组
}

标签:977,平方,right,nums,int,数组,指针
From: https://www.cnblogs.com/zeta186012/p/18421236

相关文章

  • java的二维数组
    二维数组的初始化 二维数组的进行for循环时的判断条件怎么确定的呢?  因为在二维数组是特殊的一维数组,c语言中二维数组首元素的代表的是地址,而首元素代表的是一组一维数组,计算首元素的长度也就是计算二维数组的行下标为0的一维数组的长度所以判断数组名的长度也就是判断......
  • 剖析:数组
    目录1. 一维数组2. 二维数组3. 字符数组3.1 计算数组(字符串)中字符个数3.1.1 sizeof3.1.2 strlen3.1.3 循环找寻​编辑3.1.4 指针-指针4. 变长数组5. 冒泡排序6. qsort排序7. 杨辉三角 8.  二分查找 生活中有非常多的数据,也可能是......
  • 【Go】Go语言中的数组基本语法与应用实战
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 信息学奥赛初赛天天练-92-CSP-S2023阅读程序2-动态数组、反转函数、埃氏筛法、欧拉筛
    2023CSP-S阅读程序2判断题正确填√,错误填⨉;除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<iostream>02#include<cmath>03#include<vector>04#include<algorithm>05usingnamespacestd;0607longlongsolve1(intn){08vector<boo......
  • 33. 搜索螺旋数组
    题目描述:整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在......
  • P9977[USACO23DEC]BovineAcrobaticsS
    https://www.luogu.com.cn/problem/P9977https://www.luogu.com.cn/article/ijti2qdg最后一段的理解,个人认为不妥,应该根据代码来看:#include<stdio.h>#include<algorithm>structnode{ inta,b;}c[200010];boolcmp(nodea,nodeb){ returna.b<b.b;}intans[......
  • 【洛谷 P5730】【深基5.例10】显示屏 题解(数组+循环)
    【深基5.例10】显示屏题目描述液晶屏上,每个阿拉伯数字都是可以显示成的点阵的(其中X表示亮点,.表示暗点)。现在给出数字位数(不超过)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。输入格式第一行输入一个正整数,表示数......
  • 【LeetCode Hot 100】4. 寻找两个正序数组的中位数
    题目描述要求出两个数组的中位数,第一想法当然是将这两个数组进行归并排序,然后直接得到排序后长数组的中位数。由于本题的两个数组都是排序后的数组,因此省去了排序的步骤。这种方法的时间复杂度为\(O(m+n)\),空间复杂度由于要存储排序后的长数组,所以也是\(O(m+n)\)。有没有相对更......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    思路先判断target是否存在列表中,不存在直接输出存在,则找出第一个等于target值的列表位置,即目标值在列表中的开始位置接着在当前位置继续往下查找,找到最后一个目标值等于列表值的位置(也可用二分查找找到等于target值的位置+往前、往后找到开始、结束位置,但会超限,可参考(......
  • 【C总集篇】第八章 数组和指针
    文章目录第八章数组和指针数组数组回顾初始化数组初始化数组介绍初始化失败案例部分初始化自动匹配数组给数组赋值数组边界指定数组大小多维数组二维数组的定义二维数组的初始化指针与数组函数数组与指针函数数组与指针初了解使用指针形参指针操作八种基本指针......