数组:交换

2021-05-26 每日一题 LeetCode

# 0041. 缺失的第一个正数 (opens new window)

题目

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

解析

桶排序的思想,将每个元素放在其对应的位置上,之后遍历数组,遇到第一个错位元素就是最小的正整数。

代码

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();

        // 将元素放在对应下标上
        for (int i = 0; i < n; i++) {
            while (nums[i] > 0 && nums[i] <= n && nums[i] != nums[nums[i] - 1]) {
                swap(nums[i], nums[nums[i] - 1]);
            }
        }

        // 寻找第一个不正确位置的元素下标
        for (int i = 0; i < n; i++) {
            if (nums[i] != i + 1) return i + 1;
        }
        return n + 1;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 0189. 旋转数组 (opens new window)

题目

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

解析

代码

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k %= nums.size();
        reverse(nums, 0, nums.size() - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.size() - 1);
    }

    void reverse(vector<int>& nums, int start, int end) {
        while (start < end) {
            swap(nums[start++], nums[end--]);
        }
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 0280. 摆动排序 (opens new window)

题目

给你一个无序的数组 nums, 将该数字 原地 重排后使得 nums[0] <= nums[1] >= nums[2] <= nums[3] ...。

解析

根据题意可知,奇数位的数字不小于相邻的偶数位数字,根据这个规律,遍历数组,遇到不满足要求的数字交换即可。

代码

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        for (int i = 1; i < nums.size(); i ++) {
            if ((i % 2 == 1 && nums[i] < nums[i - 1]) || (i % 2 == 0 && nums[i] > nums[i - 1])) {
                swap(nums[i], nums[i - 1]);
            }
        }
    }
};
1
2
3
4
5
6
7
8
9
10
Last Updated: 2023-01-28 4:31:25