题目:
给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
示例 1:
输入: nums = [1, 5, 1, 1, 6, 4]
输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]
示例 2:
输入: nums = [1, 3, 2, 2, 3, 1]
输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]
说明:
你可以假设所有输入都会得到有效的结果。
进阶:
你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?
思路:先对数组排序,分为大数部分和小数部分,再穿插排序。 注意顺序,例如[1,2,4,4,4,6]这个数组,通过降序穿插得到[4,6,2,4,1,4]。 如果顺序排列,则会得到[1,4,2,4,4,6]不满足要求。 这里是因为我们想尽量将小数部分的最大数放在边上(左边),这样只用靠近一个大数部分的最大数。
小数部分的最大数和大数部分的最小数应该尽可能远离。
class Solution {
public void wiggleSort(int[] nums) {
int[]numsss=nums;
// Arrays.sort(numsss);nums中也会改变
Arrays.sort(numsss);
// int len ,int
int len=nums.length;
//[]
//len-1
int []numss=new int [len];
int k=0;
for(int i=(len-1)/2;i>=0;i--){
numss[k]=nums[i];
k=k+2;
}
k=1;
for(int j=len-1;j>(len-1)/2;j--){
numss[k]=nums[j];
k=k+2;
}
for(int i=0;i<len;i++){
nums[i]=numss[i];
}
}
}
理解,与错误的代码:
1.
定义不要放在for循环中,每次都会被重新赋值的。
// for(int num:numss){
// int b=0;
// nums[b++]=num;
// }只能改变头一个!!
public void wiggleSort(int[] nums) {}
在此方法中,如有nums=numss;
nums在外的值是不会被改变的,要想改变,必须通过真实的地址赋值。
如:
for(int i=0;i<len;i++){
nums[i]=numss[i];
}
在下面代码中,在外的nums[]也会变,因为numsss有nums真实的地址,Array。sort调用了nums的真实地址进行了改变
public void wiggleSort(int[] nums) {
int[]numsss=nums;
// Arrays.sort(numsss);nums中也会改变
Arrays.sort(numsss);
}
下面的代码,在外的nums值不会变,因为nums指向的真实地址值在:
nums=numss;中被改变了,nums[0]改变的是numss中的指向的地址的值。
public void wiggleSort(int[] nums) {
int len=nums.length;
int []numss=new int[len];
numss[0]=1;
nums=numss;
nums[0]=0;
}
新建一个数组:int[] arr=new int[6]; []=[6];
错思路:观察,为小大小…/小大小大…欲分为数组为偶数或是奇数来解决,代码如下:但是结果有错,而且这种方法需改进。
代码运行结果和自己逻辑推算不一致,待解决。
class Solution {
public void wiggleSort(int[] nums) {
Arrays.sort(nums);
// int len ,int
int len=nums.length;
if(len/2==0){
int j=len-2;
for(int i=1;i<j;i=i+2){
int tmp=nums[j];
nums[j]=nums[i];
nums[i]=tmp;
j=j-2;
}
}
else{
int j=len-1;
for(int i=1;i<j;i=i+2){
int tmp=nums[j];
nums[j]=nums[i];
nums[i]=tmp;
j=j-2;
}
}
}
}