LeetCode 1470. 重新排列数组

一时失言乱红尘 2023-02-21 09:18 124阅读 0赞

给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。

请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。

1 <= n <= 500
nums.length == 2n
1 <= nums[i] <= 10^3

法一:由于每个数字都是正数且大小不超过1000,因此在一个int的32位中,数据部分只用到了低位的10个bit。我们可以先把每个数字应在位置的第11~20bit设为结果,最后再右移10bit以只留下正确结果,这种思路时间复杂度为O(n),空间复杂度为O(1)。

每个数字应在位置分析如下:

  1. 01234567 // 排序前下标
  2. 04152637 // 排序后下标
  3. // 前n个数字下标变化
  4. 0->0
  5. 1->2
  6. 2->4
  7. 3->6
  8. // 设下标为i,规律为i->2*i
  9. // 后n个数字下标变化
  10. 4->1
  11. 5->3
  12. 6->5
  13. 7->7
  14. // 规律为i->2*(i-n)+1

代码如下:

  1. class Solution {
  2. public:
  3. vector<int> shuffle(vector<int>& nums, int n) {
  4. for (int i = 0; i < 2 * n; ++i) {
  5. int j = i < n ? 2 * i : 2 * (i - n) + 1; // j为i应放在的下标
  6. nums[j] |= (nums[i] & 1023) << 10;
  7. }
  8. for (int &num : nums) {
  9. num >>= 10;
  10. }
  11. return nums;
  12. }
  13. };

法二:由于数字都是正数,我们可以将数字取负来标记已经在正确位置的数字,当我们遍历到一个数字时,如果它的值大于0,需要计算这个数字应该在的位置,然后将这个数字放到它应该在的位置并取负以说明它已经处于正确的位置,而这个位置原来的数字放到取代它的数字的原位置,此时我们要记录下这个被取代位置的数字的下标,以计算它的正确位置,直到数组中所有数字都为负数,说明所有数字都在自己正确的位置了,最后再对每个数组中的数字取负即可,这种方法的时间复杂度为O(n),而空间复杂度为O(1):

  1. class Solution {
  2. public:
  3. vector<int> shuffle(vector<int>& nums, int n) {
  4. for (int i = 0; i < 2 * n; ++i) {
  5. if (nums[i] > 0) {
  6. int j = i;
  7. while (nums[i] > 0) {
  8. j = j < n ? 2 * j : 2 * (j - n) + 1; // j为i应在的下标,同时i和j交换了位置,也记录下来了下标j以在下次循环中计算之前下标j的数字应在的下标
  9. swap(nums[i], nums[j]);
  10. nums[j] = -nums[j];
  11. }
  12. }
  13. }
  14. for (int &num : nums) {
  15. num = -num;
  16. }
  17. return nums;
  18. }
  19. };

法三:创建新数组直接填充,时间复杂度为O(n),时间复杂度为O(n):

  1. class Solution {
  2. public:
  3. vector<int> shuffle(vector<int>& nums, int n) {
  4. vector<int> res(nums.size());
  5. int index = 0;
  6. for (int i = 0; i < n; ++i) {
  7. res[index++] = nums[i];
  8. res[index++] = nums[i + n];
  9. }
  10. return res;
  11. }
  12. };

发表评论

表情:
评论列表 (有 0 条评论,124人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Matlab:数组重构和重新排列

    Matlab:数组重构和重新排列 在Matlab中,数组的重构和重新排列是常见的操作,它们可以帮助我们重新组织和处理数据。本文将介绍如何使用Matlab对数组进行重构和重新排