Skip to content

Commit 66b9286

Browse files
committed
Runtime: 154 ms (Top 50.0%) | Memory: 48.85 MB (Top 59.5%)
1 parent c589f87 commit 66b9286

File tree

1 file changed

+36
-45
lines changed

1 file changed

+36
-45
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,45 @@
1-
/*
1+
// Runtime: 154 ms (Top 50.0%) | Memory: 48.85 MB (Top 59.5%)
22

3-
startZeroNumFlips: number of flips if string were to start at i and start with 0
4-
startOneNumFlips: number of flips if string were to start at i and start with 1
5-
6-
*/
7-
var minFlips = function(s) {
8-
// value to hold starting with zero
9-
let startZeroNumFlips = 0;
10-
for (let i = 0; i < s.length; i++) {
11-
if (i % 2) {
12-
if (s[i] === '0') startZeroNumFlips++;
13-
} else {
14-
if (s[i] === '1') startZeroNumFlips++;
15-
}
3+
/**
4+
* @param {string} s
5+
* @return {number}
6+
*/
7+
var minFlips = function(s) {
8+
let length = s.length-1
9+
let flipMap = {
10+
'1': '0',
11+
'0': '1'
1612
}
17-
let startOneNumFlips = s.length - startZeroNumFlips;
13+
s = s + s
14+
let alt1 = '1'
15+
let alt2 = '0'
16+
let left = 0
17+
let right = 0
18+
let diff1 = 0
19+
let diff2 = 0
20+
let min = Infinity
1821

19-
let minimumFlips = Math.min(startZeroNumFlips, startOneNumFlips);
20-
const isEvenLength = s.length % 2 === 0;
21-
22-
for (let i = 1; i < s.length; i++) {
23-
24-
// check the previous char to see which
25-
// value to decrement
26-
if (s[i - 1] === '1') {
27-
startZeroNumFlips--;
28-
} else {
29-
startOneNumFlips--;
22+
while (right < s.length) {
23+
if (right > 0) {
24+
alt1 = flipMap[alt1]
25+
alt2 = flipMap[alt2]
3026
}
3127

32-
// swap the 2 variables because we shifted the index by 1
33-
[startOneNumFlips, startZeroNumFlips] = [startZeroNumFlips, startOneNumFlips];
34-
35-
// add corresponding number of flips
36-
if (isEvenLength) {
37-
if (s[i - 1] === '1') {
38-
startOneNumFlips++;
28+
let current = s[right]
29+
if (current !== alt1) diff1++
30+
if (current !== alt2) diff2++
31+
if (right-left === length) {
32+
min = Math.min(diff1, diff2, min)
33+
if ((length+1)%2 === 0) {
34+
if (s[left] !== flipMap[alt1]) diff1--
35+
if (s[left] !== flipMap[alt2]) diff2--
3936
} else {
40-
startZeroNumFlips++;
41-
}
42-
} else {
43-
if (s[i - 1] === '1') {
44-
startZeroNumFlips++;
45-
} else {
46-
startOneNumFlips++;
37+
if (s[left] !== alt1) diff1--
38+
if (s[left] !== alt2) diff2--
4739
}
40+
left++
4841
}
49-
50-
// calculate the number of flips
51-
minimumFlips = Math.min(startZeroNumFlips, startOneNumFlips, minimumFlips);
42+
right++
5243
}
53-
return minimumFlips;
54-
};
44+
return min
45+
};

0 commit comments

Comments
 (0)