当前位置:网站首页>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;
}
}
边栏推荐
猜你喜欢
浅谈一下pyd文件的逆向
「日志」深度学习 CUDA环境配置
【秒杀办法】根据二叉树的先序遍历、中序遍历、后序遍历快速创建二叉树
How to ensure the security of smart factories?
多聚体/壳聚糖修饰白蛋白纳米球/mPEG-HSA聚乙二醇人血清白蛋白纳米球的制备与研究
Open Source Summer | [Cloud Native] DevOps (5): Integrating Harbor
Technical life | How to draw a big picture of business
LeetCode 2349. 设计数字容器系统(SortedSet)
衡量软件产品质量的 14 个指标
C#里如何简单的校验时间格式
随机推荐
POE交换机全方位解读(中)
从技术全景到场景实战,透析「窄带高清」的演进突破
sed 命令
Taking advantage of cloud-network integration, e-Surfing Cloud has paved the way for digital transformation for government and enterprises
【软考软件评测师】基于经验的测试技术
Open Source Summer | [Cloud Native] DevOps (5): Integrating Harbor
HDF驱动框架的API(3)
备战无人机配送:互联网派To C、技术派To B
衡量软件产品质量的 14 个指标
共享平台如何提高财务的分账记账效率?
洛谷P1966 火柴排队
浅谈一下pyd文件的逆向
Why young people are snapping up domestic iPhone, because it is much cheaper and more populist
麦聪DaaS平台 3.7.0 Release 正式发布:全面支持国际化
golang刷leetcode 经典(1) LRU缓存机制
IDEA相关配置(特别完整)看完此篇就将所有的IDEA的相关配置都配置好了、设置鼠标滚轮修改字体大小、设置鼠标悬浮提示、设置主题、设置窗体及菜单的字体及字体大小、设置编辑区主题、通过插件更换主题
实例034:调用函数
Data Governance: The Evolution of Data Integration and Application Patterns
浅谈混迹力扣和codeforces上的几个月
LeetCode 1947. 最大兼容性评分和(状态枚举DP)