在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 6, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。
示例:
输入: [5, 3, 1, 2, 3]
输出: [5, 1, 3, 2, 3]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/peaks-and-valleys-lcci
根据下面的提示1:
假设数组按升序排序。有什么办法可以把它调整为交替的高峰和低谷?
只要将数组进行排序,就可以想到最大值和最小值肯定时峰谷相邻的。
所以:
package LeetCode;
import java.util.Arrays;
public class PeaksAndValleys {
public void wiggleSort(int[] nums) {
//思路:我们可以将数组进行排序,然后依次取出相对的最大值和最小值
int idx = 0, len = nums.length;
if (len < 3) return;
int low = 0, high = len - 1;
//复制原数组进行排序
int[] sorted = Arrays.copyOf(nums, len);
Arrays.sort(sorted);
//依次取出相对最大和最小值放入数组
while (low < high) {
nums[idx++] = sorted[high--];
nums[idx++] = sorted[low++];
}
// 当数组为奇数时,就会剩下最后一个中间的,将其放入数组
if (len % 2 > 0)
nums[idx] = sorted[low];
}
}