
题目地址:https://leetcode-cn.com/problems/shuffle-the-array/
给你一个数组 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] 解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7] 示例 2: 输入:nums = [1,2,3,4,4,3,2,1], n = 4 输出:[1,4,2,3,3,2,4,1] 示例 3: 输入:nums = [1,1,2,2], n = 2 输出:[1,2,1,2]
提示: 1 <= n <= 500 nums.length == 2n 1 <= nums[i] <= 10^3
这道题的思路就是,给你一个数组,把前半段和后半段交叉组合,比如前半段是x1,x2...xn,后半段是y1,y2…yn,则返回x1,y1,x2,y2…xn,yn。
一、爆破法
因为不想直接新增一个数组,所以我们还是用比较愚蠢的办法。
我们用前后段交换位置,然后左右指针往中间缩短一位,再交换,如此往复。
执行结果如下:
53 / 53 个通过测试用例
状态:通过
执行用时: 5 ms
内存消耗: 38.8 MB
public int[] shuffleMe2(int[] nums, int n) {
int l=1;
int r = nums.length-2;
while(l < n) {
swap(nums, l, r, n);
l++;
r--;
}
return nums;
}
public void swap(int[] nums, int l, int r,int n) {
int temp;
while (n<=r) {
temp = nums[l];
nums[l] = nums[n];
nums[n] = temp;
l++;
n++;
}
}时间和内存都不尽如人意。。。
好吧,我们还是聪明点。
二、新数组读取老数组法
用新数组,按照规则读取老数组然后返回新数组
执行结果如下:
53 / 53 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 38.7 MB
public int[] shuffleMe(int[] nums, int n) {
int index = 0;
int[] result = new int[nums.length];
for (int i = 0; i < n; i++) {
result[index++] = nums[i];
result[index++] = nums[n+i];
}
return result;
}代码量少了很多,时间也是100%,但是内存还是不满意,我们继续看看评论区。
好吧,评论区基本也都是新增数组,那么,我们next。