面试题 10.11. 峰与谷 【中等题】【数组】
在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 6, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。
输入: [5, 3, 1, 2, 3]
输出: [5, 1, 3, 2, 3]
题目讲解
【历史重难点题目】
【思路】
- 让我们假设“峰”在偶数位,“谷”在奇数位(倒过来也一样)
- 那么遍历一遍数组,有以下两个情况:
- 如果i为峰的位置,则判断当前位置是否小于前一个位置(前一个为谷),若小于,则交换,大于则不处理。即:
if(nums[i]<nums[i-1]) swap(nums[i],nums[i-1])
- 如果i为谷的位置,则判断当前位置是否大于前一个位置(前一个为峰),若大于,则交换,大于则不处理。即:
if(nums[i]>nums[i-1]) swap(nums[i],nums[i-1])
【代码】
public void wiggleSort(int[] nums) {
for(int i = 1;i < nums.length; i++){
if((i%2 == 0 && nums[i] < nums[i-1])||(i%2 != 0 && nums[i] > nums[i-1])){
int temp = nums[i];
nums[i] = nums[i-1];
nums[i-1] = temp;
}
}
}
【备注】
- 这里有一个加速的小技巧,判断奇偶的时候,如果用取余运算
%
速度会慢一点。这里用位运算的话速度会稍稍快一点。i&1==1
即奇数,i&1==0
即偶数。&
是“与”操作。大家可以试一下两段代码的速度,的确是有差别的。
public void wiggleSort(int[] nums) {
for(int i = 1;i < nums.length; i++){
if(((i&1) == 0 && nums[i] < nums[i-1])||((i&1) == 1 && nums[i] > nums[i-1])){
int temp = nums[i];
nums[i] = nums[i-1];
nums[i-1] = temp;
}
}
}
微信关注我,带你拿大厂offer