1 Star 0 Fork 0

表情扭曲 / leetcode

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
lc324.java 1.92 KB
一键复制 编辑 原始数据 按行查看 历史
liu13 提交于 2019-08-18 15:42 . 20190818
package code;
import java.util.Arrays;
/*
* 324. Wiggle Sort II
* 题意:小大小大小大 这样排序
* 难度:Medium
* 分类:Sort
* 思路:先找到中位数,然后一个小于中位数的,一个大于中位数的这样组合
* 用 index map 的方式可以使空间也为O(1)
* Tips:挺难的。
*/
public class lc324 {
public void wiggleSort(int[] nums) {
if(nums.length==1) return;
int n = nums.length, m = (n + 1) >> 1;// (nums.length+1)/2 注意+1
int[] copy = Arrays.copyOf(nums, n);
int median = findMedium(nums, 0, nums.length-1, m);
for (int i = 0, j = 0, k = n - 1; j <= k;) { // <medium的放左边, >在右边
if (copy[j] < median) {
swap(copy, j++, i++);
} else if (copy[j] > median) {
swap(copy, j, k--);
} else {
j++;
}
}
for (int i = m - 1, j = 0; i >= 0; i--, j += 2) nums[j] = copy[i]; //注意这点细节,i--倒着来,防止中位数重复的情况bug
for (int i = n - 1, j = 1; i >= m; i--, j += 2) nums[j] = copy[i];
}
private void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
public int findMedium(int[] nums, int left, int right, int k){
int cur = nums[left];
int l = left;
int r = right;
while(left<right){
while( left<right && nums[right]>=nums[left] ) right--;
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
while( left<right && nums[left]<nums[right]) left++;
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
if(left==k-1) return nums[left];
else if(left>=k) return findMedium(nums, l, right-1, k);
else return findMedium(nums, right+1, r, k);
}
}
1
https://gitee.com/abfantasy/leetcode.git
git@gitee.com:abfantasy/leetcode.git
abfantasy
leetcode
leetcode
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891