diff --git a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/README.md b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/README.md index bec56c71c5d9c..995937ce1105a 100644 --- a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/README.md +++ b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/README.md @@ -163,15 +163,35 @@ func minSwaps(nums []int) int { ```ts function minSwaps(nums: number[]): number { + const n = nums.length; const k = nums.reduce((a, b) => a + b, 0); - let cnt = nums.slice(0, k).reduce((a, b) => a + b, 0); - let mx = cnt; + let cnt = k - nums.slice(0, k).reduce((a, b) => a + b, 0); + let min = cnt; + + for (let i = k; i < n + k; i++) { + cnt += nums[i - k] - nums[i % n]; + min = Math.min(min, cnt); + } + + return min; +} +``` + +#### JavaScript + +```js +function minSwaps(nums) { const n = nums.length; - for (let i = k; i < n + k; ++i) { - cnt += nums[i % n] - nums[(i - k + n) % n]; - mx = Math.max(mx, cnt); + const k = nums.reduce((a, b) => a + b, 0); + let cnt = k - nums.slice(0, k).reduce((a, b) => a + b, 0); + let min = cnt; + + for (let i = k; i < n + k; i++) { + cnt += nums[i - k] - nums[i % n]; + min = Math.min(min, cnt); } - return k - mx; + + return min; } ``` @@ -222,4 +242,66 @@ public class Solution { + + +### 方法二:前缀和 + + + +#### TypeScript + +```ts +function minSwaps(nums: number[]): number { + const n = nums.length; + + const getMin = (x: 0 | 1) => { + const prefixSum = Array(n + 1).fill(0); + for (let i = 1; i <= n; i++) { + prefixSum[i] = prefixSum[i - 1] + (nums[i - 1] === x); + } + + const length = prefixSum[n]; + let ans = Number.POSITIVE_INFINITY; + for (let l = 0, r = length; r <= n; l++, r++) { + const min = length - (prefixSum[r] - prefixSum[l]); + ans = Math.min(ans, min); + } + + return ans; + }; + + return Math.min(getMin(0), getMin(1)); +} +``` + +#### JavaScript + +```js +function minSwaps(nums) { + const n = nums.length; + + const getMin = x => { + const prefixSum = Array(n + 1).fill(0); + for (let i = 1; i <= n; i++) { + prefixSum[i] = prefixSum[i - 1] + (nums[i - 1] === x); + } + + const length = prefixSum[n]; + let ans = Number.POSITIVE_INFINITY; + for (let l = 0, r = length; r <= n; l++, r++) { + const min = length - (prefixSum[r] - prefixSum[l]); + ans = Math.min(ans, min); + } + + return ans; + }; + + return Math.min(getMin(0), getMin(1)); +} +``` + + + + + diff --git a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/README_EN.md b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/README_EN.md index fa654171b5a71..56ec6271d38a0 100644 --- a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/README_EN.md +++ b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/README_EN.md @@ -165,15 +165,35 @@ func minSwaps(nums []int) int { ```ts function minSwaps(nums: number[]): number { + const n = nums.length; const k = nums.reduce((a, b) => a + b, 0); - let cnt = nums.slice(0, k).reduce((a, b) => a + b, 0); - let mx = cnt; + let cnt = k - nums.slice(0, k).reduce((a, b) => a + b, 0); + let min = cnt; + + for (let i = k; i < n + k; i++) { + cnt += nums[i - k] - nums[i % n]; + min = Math.min(min, cnt); + } + + return min; +} +``` + +#### JavaScript + +```ts +function minSwaps(nums) { const n = nums.length; - for (let i = k; i < n + k; ++i) { - cnt += nums[i % n] - nums[(i - k + n) % n]; - mx = Math.max(mx, cnt); + const k = nums.reduce((a, b) => a + b, 0); + let cnt = k - nums.slice(0, k).reduce((a, b) => a + b, 0); + let min = cnt; + + for (let i = k; i < n + k; i++) { + cnt += nums[i - k] - nums[i % n]; + min = Math.min(min, cnt); } - return k - mx; + + return min; } ``` @@ -224,4 +244,66 @@ public class Solution { + + +### Solution 2: Prefix Sum + + + +#### TypeScript + +```ts +function minSwaps(nums: number[]): number { + const n = nums.length; + + const getMin = (x: 0 | 1) => { + const prefixSum = Array(n + 1).fill(0); + for (let i = 1; i <= n; i++) { + prefixSum[i] = prefixSum[i - 1] + (nums[i - 1] === x); + } + + const length = prefixSum[n]; + let ans = Number.POSITIVE_INFINITY; + for (let l = 0, r = length; r <= n; l++, r++) { + const min = length - (prefixSum[r] - prefixSum[l]); + ans = Math.min(ans, min); + } + + return ans; + }; + + return Math.min(getMin(0), getMin(1)); +} +``` + +#### JavaScript + +```js +function minSwaps(nums) { + const n = nums.length; + + const getMin = x => { + const prefixSum = Array(n + 1).fill(0); + for (let i = 1; i <= n; i++) { + prefixSum[i] = prefixSum[i - 1] + (nums[i - 1] === x); + } + + const length = prefixSum[n]; + let ans = Number.POSITIVE_INFINITY; + for (let l = 0, r = length; r <= n; l++, r++) { + const min = length - (prefixSum[r] - prefixSum[l]); + ans = Math.min(ans, min); + } + + return ans; + }; + + return Math.min(getMin(0), getMin(1)); +} +``` + + + + + diff --git a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution.js b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution.js new file mode 100644 index 0000000000000..7865a1b13492a --- /dev/null +++ b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution.js @@ -0,0 +1,13 @@ +function minSwaps(nums) { + const n = nums.length; + const k = nums.reduce((a, b) => a + b, 0); + let cnt = k - nums.slice(0, k).reduce((a, b) => a + b, 0); + let min = cnt; + + for (let i = k; i < n + k; i++) { + cnt += nums[i - k] - nums[i % n]; + min = Math.min(min, cnt); + } + + return min; +} diff --git a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution.ts b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution.ts index 6c616343055a4..6164515eb70cf 100644 --- a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution.ts +++ b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution.ts @@ -1,11 +1,13 @@ function minSwaps(nums: number[]): number { - const k = nums.reduce((a, b) => a + b, 0); - let cnt = nums.slice(0, k).reduce((a, b) => a + b, 0); - let mx = cnt; const n = nums.length; - for (let i = k; i < n + k; ++i) { - cnt += nums[i % n] - nums[(i - k + n) % n]; - mx = Math.max(mx, cnt); + const k = nums.reduce((a, b) => a + b, 0); + let cnt = k - nums.slice(0, k).reduce((a, b) => a + b, 0); + let min = cnt; + + for (let i = k; i < n + k; i++) { + cnt += nums[i - k] - nums[i % n]; + min = Math.min(min, cnt); } - return k - mx; + + return min; } diff --git a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution2.js b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution2.js new file mode 100644 index 0000000000000..2e2f0cb166eda --- /dev/null +++ b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution2.js @@ -0,0 +1,21 @@ +function minSwaps(nums) { + const n = nums.length; + + const getMin = x => { + const prefixSum = Array(n + 1).fill(0); + for (let i = 1; i <= n; i++) { + prefixSum[i] = prefixSum[i - 1] + (nums[i - 1] === x); + } + + const length = prefixSum[n]; + let ans = Number.POSITIVE_INFINITY; + for (let l = 0, r = length; r <= n; l++, r++) { + const min = length - (prefixSum[r] - prefixSum[l]); + ans = Math.min(ans, min); + } + + return ans; + }; + + return Math.min(getMin(0), getMin(1)); +} diff --git a/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution2.ts b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution2.ts new file mode 100644 index 0000000000000..6d83640ff8898 --- /dev/null +++ b/solution/2100-2199/2134.Minimum Swaps to Group All 1's Together II/Solution2.ts @@ -0,0 +1,21 @@ +function minSwaps(nums: number[]): number { + const n = nums.length; + + const getMin = (x: 0 | 1) => { + const prefixSum = Array(n + 1).fill(0); + for (let i = 1; i <= n; i++) { + prefixSum[i] = prefixSum[i - 1] + (nums[i - 1] === x); + } + + const length = prefixSum[n]; + let ans = Number.POSITIVE_INFINITY; + for (let l = 0, r = length; r <= n; l++, r++) { + const min = length - (prefixSum[r] - prefixSum[l]); + ans = Math.min(ans, min); + } + + return ans; + }; + + return Math.min(getMin(0), getMin(1)); +}