Re: [閒聊] 每日leetcode
看板Marginalman作者sustainer123 (caster )時間1年前 (2024/06/12 10:09)推噓3(3推 0噓 3→)留言6則, 5人參與討論串347/1549 (看更多)
※ 引述《yam276 (虛構史學家)》之銘言:
: 75. Sort Colors
: https://leetcode.com/problems/sort-colors/
: 一個陣列有三種球
: 不准用內建方法 不准用新陣列儲存
: 在原本的陣列把球球照種類排序
: 思路:
: 三指針
: 左右邊界放指針 跟一個中間的遍歷指針
: 每次檢查球球是否需要換位
: 0 => 就換了之後 左中+1
: 1 => 不用換 中+1繼續
: 2 => 換了之後 右-1 中不用動 因為下一動會再檢查一次
: 注意 1. while條件是 中<=右
: 2. 加一個break判斷避免nums.len()==0
: Code:
: impl Solution {
: pub fn sort_colors(nums: &mut Vec<i32>) {
: let mut left = 0;
: let mut mid = 0;
: let mut right = nums.len() - 1;
: while mid <= right {
: match nums[mid] {
: 0 => {
: nums.swap(left, mid);
: left += 1;
: mid += 1;
: }
: 1 => {
: mid += 1;
: }
: 2 => {
: nums.swap(mid, right);
: if right == 0 {
: break;
: }
: right -= 1;
: }
: _ => unreachable!(),
: }
: }
: }
: }
思路:
其實還是記數 不過稍微修改一下 只用常數空間+一次遍歷
切片應該不算遍歷......吧
三指針應該才是正確方法 這招就python偷吃步
Python Code:
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
zero = 0
one = 0
two = 0
for n in nums:
if n == 0:
zero += 1
elif n == 1:
one += 1
else:
two += 1
nums[:zero] = [0] * zero
nums[zero:zero+one] = [1] * one
nums[zero+one:] = [2] * two
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.239.169 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1718158149.A.30B.html
推
06/12 10:14,
1年前
, 1F
06/12 10:14, 1F
→
06/12 10:20,
1年前
, 2F
06/12 10:20, 2F
推
06/12 10:29,
1年前
, 3F
06/12 10:29, 3F
推
06/12 10:34,
1年前
, 4F
06/12 10:34, 4F
→
06/12 10:36,
1年前
, 5F
06/12 10:36, 5F
→
06/12 11:36,
1年前
, 6F
06/12 11:36, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 347 之 1549 篇):