面试题 10.11. 峰与谷
原始题目链接:https://leetcode-cn.com/problems/peaks-and-valleys-lcci/submissions/
在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。
示例:
输入: [5, 3, 1, 2, 3]
输出: [5, 1, 3, 2, 3]
解题思路:
一次遍历,判断当前元素和它的前一个元素比较,依据题目的峰和谷的定义,假设一个峰谷交错的顺序,然后比较即可。具体实现看代码及注释。
代码实现:
class Solution:
def wiggleSort(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 一次遍历:交错的排序,例如:峰-谷-峰-谷-峰...
for i in range(1, len(nums)):
# 按照例子,比如峰谷峰的顺序
# 那索引为第0 2 4...的位置是峰,即位置对2求余是0
if i % 2 == 0:
# 当前位置的元素如果和它的前一个元素相比较,大于的话就交换元素
# 把大的元素换到峰的位置上去
if nums[i] > nums[i - 1]:
nums[i], nums[i - 1] = nums[i - 1], nums[i]
# 谷的索引,即索引是奇数
else:
# 当前位置的元素如果和它的前一个元素相比较,小于的话就交换元素
# 把小的元素放在谷的位置上去
if nums[i] < nums[i - 1]:
nums[i], nums[i - 1] = nums[i - 1], nums[i]
参考文献:
https://leetcode-cn.com/problems/peaks-and-valleys-lcci/solution/onsuan-fa-qiu-jie-by-whut_hj/