LeetCode 1470 重新排列陣列

2021-10-07 15:06:43 字數 1206 閱讀 6438

給你乙個陣列 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)。

每個數字應在位置分析如下:

01234567

// 排序前下標

04152637

// 排序後下標

// 前n個數字下標變化

0->01

->22

->43

->

6// 設下標為i,規律為i->2*i

// 後n個數字下標變化

4->15

->36

->57

->

7// 規律為i->2*(i-n)+1

**如下:

class solution 

for(

int&num : nums)

return nums;}}

;

法二:由於數字都是正數,我們可以將數字取負來標記已經在正確位置的數字,當我們遍歷到乙個數字時,如果它的值大於0,需要計算這個數字應該在的位置,然後將這個數字放到它應該在的位置並取負以說明它已經處於正確的位置,而這個位置原來的數字放到取代它的數字的原位置,此時我們要記錄下這個被取代位置的數字的下標,以計算它的正確位置,直到陣列中所有數字都為負數,說明所有數字都在自己正確的位置了,最後再對每個陣列中的數字取負即可,這種方法的時間複雜度為o(n),而空間複雜度為o(1):

class solution }}

for(

int&num : nums)

return nums;}}

;

法三:建立新陣列直接填充,時間複雜度為o(n),時間複雜度為o(n):

class solution 

return res;}}

;

leetcode 1470 重新排列陣列

1470.重新排列陣列 給你乙個陣列 nums 陣列中有 2n 個元素,按 x1,x2,xn,y1,y2,yn 的格式排列。請你將陣列按 x1,y1,x2,y2,xn,yn 格式重新排列,返回重排後的陣列。示例 輸入 nums 2,5,1,3,4,7 n 3 輸出 2,3,5,4,1,7 解釋 由於...

1470 重新排列陣列

1470.重新排列陣列 給你乙個陣列 nums 陣列中有 2n 個元素,按 x1,x2,xn,y1,y2,yn 的格式排列。請你將陣列按 x1,y1,x2,y2,xn,yn 格式重新排列,返回重排後的陣列。示例 1 輸入 nums 2,5,1,3,4,7 n 3 輸出 2,3,5,4,1,7 解釋 ...

leetcode重新排序陣列 1470

給你乙個陣列 nums 陣列中有 2n 個元素,按 x1,x2,xn,y1,y2,yn 的格式排列。請你將陣列按 x1,y1,x2,y2,xn,yn 格式重新排列,返回重排 後的陣列。輸入 nums 2,5,1,3,4,7 n 3 輸出 2,3,5,4,1,7 解釋 由於 x1 2,x2 5,x3 ...