Re: [閒聊] 每日leetcode

看板Marginalman作者 (caster )時間1年前 (2024/08/03 08:31), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串622/1554 (看更多)
※ 引述《JIWP (神楽めあ的錢包)》之銘言: : 2134. Minimum Swaps to Group All 1's Together II : nums矩陣由0、1組成,且nums為circular array : 你可以任意將nums裡面的兩個元素互換位置 : 請問要將所有1元素集中在一起,最少需要交換幾次 : 思路: : 用sliding window : 先計算1的數量,假設有n個 : 接著用大小為n的window去遍歷nums : 你要交換的次數就是n-window內1的數量 : 所以找出1最多的地方就好 : 然後因為nums是circular array所以要記得檢查頭尾連接的地方 : golang code : : func minSwaps(nums []int) int { : total, cnt, maxnum, n, idx := 0, 0, 0, len(nums), 0 : for _, val := range nums { : total += val : } : for i := 0; i < total; i++ { : cnt += nums[i] : } : maxnum = cnt : for i := total; i < n; i++ { : cnt += nums[i] - nums[idx] : idx++ : maxnum = max(maxnum, cnt) : } : for i := 0; i < total-1; i++ { : cnt += nums[i] - nums[idx] : idx++ : maxnum = max(maxnum, cnt) : } : return total - maxnum : } 思路: sliding window 加加減減 先算one總數 之後算[0:one_sum]裡面1的總數 之後窗戶開滑 左邊是1就減 右邊是1就加 因為頭尾相連所以做兩次 大概這樣 Python Code: class Solution: def minSwaps(self, nums: List[int]) -> int: n = len(nums) result = one_sum = sum(nums) count = sum(nums[0:one_sum]) for i in range(one_sum,n*2): count += (nums[i%n]) count -= (nums[(i-one_sum)%n]) result = min(result,one_sum-count) return result -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.160.111 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1722645093.A.711.html
文章代碼(AID): #1chNfbSH (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1chNfbSH (Marginalman)