当前位置:网站首页>LeetCode每日一题(324. Wiggle Sort II)
LeetCode每日一题(324. Wiggle Sort II)
2022-08-02 18:25:00 【wangjun861205】
Given an integer array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]…
You may assume the input array always has a valid answer.
Example 1:
Input: nums = [1,5,1,1,6,4]
Output: [1,6,1,5,1,4]
Explanation: [1,4,1,5,1,6] is also accepted.
Example 2:
Input: nums = [1,3,2,2,3,1]
Output: [2,3,1,3,1,2]
Constraints:
- 1 <= nums.length <= 5 * 104
- 0 <= nums[i] <= 5000
- It is guaranteed that there will be an answer for the given input nums.
Follow Up: Can you do it in O(n) time and/or in-place with O(1) extra space?
nums = [1, 5, 1, 1, 6, 4]
排序:
[1, 1, 1, 4, 5, 6]组出所有"小于"的 pair
paris = [[1, 4], [1, 5], [1, 6]]1 < 4
1 < 5
1 < 6用 pairs 组出所有"大于"的 pair
(1 < 4) > (1 < 5) > (1 < 6)
之所以能这样进行排布, 是因为对于任意的 pair[i], pair[i][0]一定是<=任意一个 pair[j][1]的, 但是这里要考虑 pair[i][1] == pair[j][0]的情况, 例如: nums=[4, 5, 5, 6], pairs = [[4, 5], [5, 6]], 此时[4, 5][1] == [5, 6][0], 如果我们按正序排列这两个 pairs 的话, 那就会变成(4 < 5) > (5 < 6), 中间的>显然是不成立的, 但是因为 pair[i][0] <= pair[j][1], 所以我们只需要把[5, 6]放到[4, 5]之前就好了, 因为题目中说只要有一个成立的答案, 所以左右两边必定有一个是可以放置的
这个思路肯定不是最优的, 而且实现也做的不好, 题目进一步提出了 O(n)复杂度的解法, 有兴趣的可以尝试解一下
impl Solution {
pub fn wiggle_sort(nums: &mut Vec<i32>) {
nums.sort();
let mut pairs = Vec::new();
let first_half = nums[..nums.len() / 2 + nums.len() % 2].to_vec();
let second_half = nums[nums.len() / 2 + nums.len() % 2..].to_vec();
for i in 0..first_half.len().max(second_half.len()) {
let mut p = vec![first_half[i]];
if i < second_half.len() {
p.push(second_half[i]);
}
pairs.push(p);
}
let mut ans = Vec::new();
while !pairs.is_empty() {
let mut p = pairs.remove(0);
if let Some(last) = ans.pop() {
if last == p[0] {
ans.push(last);
p.append(&mut ans);
ans = p;
} else {
ans.push(last);
ans.append(&mut p);
}
continue;
}
ans.append(&mut p);
}
*nums = ans;
}
}
边栏推荐
猜你喜欢
随机推荐
请教一个数据库连接池的问题,目前已知是事务未设置超时,又有一块代码事务没有提交,一直把连接给耗尽了,
魔豹联盟:佛萨奇2.0dapp系统开发模式详情
多聚体/壳聚糖修饰白蛋白纳米球/mPEG-HSA聚乙二醇人血清白蛋白纳米球的制备与研究
洛谷P4799 世界冰球锦标赛
WPF login with Prism
论文阅读_胶囊网络CapsNet
LeetCode 2336. 无限集中的最小数字(SortedSet)
技术人生 | 如何设定业务目标
【软考软件评测师】基于经验的测试技术
技术人生 | 如何画业务大图
共享平台如何提高财务的分账记账效率?
2022最新彩虹表
golang 源码分析(39)hystrix-go
洛谷P2345 MooFest G
golang刷leetcode 经典(2)拓扑排序
1.0.0到1.0.2的底层数据库表的更新,需要再重新自建数据库吗?
电子行业库存管理痛点与WMS仓储管理系统解决方案
IDEA相关配置(特别完整)看完此篇就将所有的IDEA的相关配置都配置好了、设置鼠标滚轮修改字体大小、设置鼠标悬浮提示、设置主题、设置窗体及菜单的字体及字体大小、设置编辑区主题、通过插件更换主题
影响PoE供电传输距离的除了网线还有啥?
ETH Zurich重磅综述 | 人脸-素描合成:一个新的挑战









