跳转至

3667. 按绝对值排序数组 🔒

题目描述

给定一个整数数组 nums

nums 中的元素按照它们的绝对值 非递减 顺序排列。

返回 任何 满足此条件的重新排列数组。

注意:整数 x 的绝对值定义为:

  • x 若 x >= 0
  • -x 若 x < 0

 

示例 1:

输入:nums = [3,-1,-4,1,5]

输出:[-1,1,3,-4,5]

解释:

  • nums 中元素的绝对值分别是 3,1,4,1,5。
  • 将它们按升序排序,得到 1,1,3,4,5。
  • 这对应于 [-1, 1, 3, -4, 5]。另一种可能的排序是 [1, -1, 3, -4, 5]

示例 2:

输入:nums = [-100,100]

输出:[-100,100]

解释:

  • nums 中元素的绝对值分别是 100,100。
  • 将它们按升序排列,得到 100,100。
  • 这对应于 [-100, 100]。另一种可能的排序是 [100, -100]

 

提示:

  • 1 <= nums.length <= 100
  • -100 <= nums[i] <= 100

解法

方法一:自定义排序

我们可以使用自定义的排序函数来对数组进行排序,排序的依据是每个元素的绝对值。

时间复杂度 \(O(n \times \log n)\),空间复杂度 \(O(\log n)\)。其中 \(n\) 是数组 \(\textit{nums}\) 的长度。

1
2
3
class Solution:
    def sortByAbsoluteValue(self, nums: List[int]) -> List[int]:
        return sorted(nums, key=lambda x: abs(x))
1
2
3
4
5
6
7
8
9
class Solution {
    public int[] sortByAbsoluteValue(int[] nums) {
        return Arrays.stream(nums)
            .boxed()
            .sorted(Comparator.comparingInt(Math::abs))
            .mapToInt(Integer::intValue)
            .toArray();
    }
}
1
2
3
4
5
6
7
8
9
class Solution {
public:
    vector<int> sortByAbsoluteValue(vector<int>& nums) {
        sort(nums.begin(), nums.end(), [](int a, int b) {
            return abs(a) < abs(b);
        });
        return nums;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func sortByAbsoluteValue(nums []int) []int {
    slices.SortFunc(nums, func(a, b int) int {
        return abs(a) - abs(b)
    })
    return nums
}

func abs(x int) int {
    if x < 0 {
        return -x
    }
    return x
}
1
2
3
function sortByAbsoluteValue(nums: number[]): number[] {
    return nums.sort((a, b) => Math.abs(a) - Math.abs(b));
}
1
2
3
4
5
6
impl Solution {
    pub fn sort_by_absolute_value(mut nums: Vec<i32>) -> Vec<i32> {
        nums.sort_by_key(|&x| x.abs());
        nums
    }
}

评论