【C++】LeetCode 力扣周赛279 第一题 题解

87 阅读1分钟

【C++】LeetCode 力扣周赛279 第一题 题解

题目链接

2164. 对奇偶下标分别排序 - 力扣(LeetCode) (leetcode-cn.com)

题目要求

给你一个下标从0开始的整数数组nums。根据下述规则重排nums中的值:

非递增顺序排列nums奇数下标 上的所有值。 举个例子,如果排序前nums = [4,1,2,3],对奇数下标的值排序后变为[4,3,2,1]。奇数下标13的值按照非递增顺序重排。 按 非递减 顺序排列nums偶数下标 上的所有值。 举个例子,如果排序前nums = [4,1,2,3],对偶数下标的值排序后变为[2,1,4,3]。偶数下标02的值按照非递减顺序重排。 返回重排nums的值之后形成的数组。

思路

首先新开两个数组nums1nums2,分别用来存放原数组奇数下标及偶数下标的元素,再开一个数组res作为答案输出。

然后分别对两个数组使用sort函数排序,要求nums1按照非递增顺序排列,那么直接使用reverse函数反转一下即可。

最后将两个数组依次合并到答案数组res中即可。

详细代码

class Solution
{
public:
    vector<int> sortEvenOdd(vector<int> &nums)
    {
        vector<int> nums1;
        vector<int> nums2;
        vector<int> res(nums.size());
        for (int i = 0; i < nums.size(); i++)
        {
            if (i % 2 == 1)
                nums1.push_back(nums[i]);
            else
                nums2.push_back(nums[i]);
        }
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        reverse(nums1.begin(), nums1.end());
        int m = 0, n = 0;
        for (int i = 0; i < nums.size(); i++)
        {
            if (i % 2 == 1)
                res[i] = nums1[m++];
            else
                res[i] = nums2[n++];
        }
        return res;
    }
};

执行结果

image-20220207215506440.png