// // O(NlogN)
var findUnsortedSubarray = function (nums) {
let sorted = [...nums].sort((a, b) => a - b);
let start = 0;
let end = 0;
for (let i = 0; i < sorted.length; i++) {
if (sorted[i] !== nums[i]) {
start = i;
break;
}
}
for (let j = sorted.length - 1; j >= 0; j--) {
if (sorted[j] !== nums[j]) {
end = j;
break;
}
}
if (!start && !end) return 0;
return end - start + 1;
};
// O(N)
const findUnsortedSubarray = nums => {
let min = 100000;
let max = -100000;
for (let i = 1; i < nums.length; i++) {
let prev = nums[i - 1];
let cur = nums[i];
if (cur < prev) min = Math.min(min, cur);
}
for (let j = nums.length - 1; j >= 0; j--) {
let prev = nums[j + 1];
let cur = nums[j];
if (cur > prev) max = Math.max(max, cur);
}
if (max === 0 && min === 100000) return 0;
let start = 0;
let end = 0;
for (let k = 0; k < nums.length; k++) {
if (min < nums[k]) {
start = k;
break;
}
}
for (let u = nums.length - 1; u >= 0; u--) {
if (max > nums[u]) {
end = u;
break;
}
}
if (!start && !end) return 0;
let answer = end - start + 1;
return answer;
};
// ๊บพ์ด๋ ์ง์ ์ค์์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐพ๊ณ (์์์๋ถํฐ loop์ ๋ ๋)
// ๊บพ์ด๋ ์ง์ ์ค์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋๋ค(๋ค์์ ๋ถํฐ loop์ ๋ ๋)
// ์ดํ ํด๋น ๊บพ์ด๋ ์ง์ ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋น๊ฒจ์ค๋ค. (์์์๋ถํฐ loop์ ๋ ๋)
// ์ดํ ํด๋น ๊บพ์ด๋ ์ง์ ์ ์ผ์ชฝ์ผ๋ก ๋น๊ฒจ์ค๋ค. (๋ค์์๋ถํฐ loop์ ๋ ๋)
1. ๋จผ์ ์ฒ์ ๋ด๊ฐ ํผ ๋ฐฉ๋ฒ์ด๋ค. ์๊ฐ ๋ณต์ก๋ O(NlogN)์ผ๋ก ํ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์์ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํด์ nums
๋ฐฐ์ด๊ณผ sorted
๋ฐฐ์ด์ ๋น๊ตํ์.
์๋ณธ ๋ฐฐ์ด nums
์
nums
๋ฅผ ์ ๋ ฌํ ๋ฐฐ์ด sorted
๋ผ๋ ๋ฐฐ์ด์ ์ค๋นํ๋ค.
์ดํ ์์์๋ถํฐ ํ๋์ฉ ๋น๊ตํ๊ณ (์์๋๋ก ์ํํ๋ ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ) ์ฒ์ nums[i]
์ sorted[i]
๊ฐ ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค. (ํด๋น ์ธ๋ฑ์ค = start
)
๋ํ ๋ค์์๋ถํฐ ํ๋์ฉ ๋น๊ต๋ฅผ ํด์ (์ญ์์ผ๋ก ์ํํ๋ ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ) nums[j]
์ sorted[j]
๊ฐ ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค. (ํด๋น ์ธ๋ฑ์ค = end
)
์ดํ end
- start
+ 1์ ํ๋ฉด ๊ทธ๊ฒ ์ต์ ์ ๋ ฌ์ ํ ์ ์๋ subArray์ ๊ธธ์ด๋ค.
2. ๋ ๋ฒ์งธ๋ ์๊ฐ ๋ณต์ก๋ O(N)์ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐ๋ณต๋ฌธ 4๊ฐ๋ก 4 * N์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ ์ผ๋ก๋ O(N)์ด๋ค.
์์ ๊ทธ๋ํ๋ฅผ ๋ณด์. ๊ทธ๋ํ๋ฅผ nums
๋ฐฐ์ด์ ๊ทธ๋ํ๋ก ํํํ ๊ทธ๋ฆผ์ด๋ผ๊ณ ์๊ฐํด๋ณด์.
nums
๋ฐฐ์ด์ ์ํํ๋ค๊ณ ์๊ฐํ์ ๋, ๊บพ์ด๋ ์ง์ (๊ทธ๋ํ๊ฐ ์๋๋ก ๋ด๋ ค๊ฐ๋ ์ง์ )์ด ๋ฐ๋ก ์ ๋ ฌ์ ํด์ผ๋๋ ์ง์ ์ด๋ค. ๊ทธ ๊บพ์ด๋ ์ง์ ์ค ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ์ง๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค.์ด๋ฒ์ ๋์์๋ถํฐ 0๊น์ง ์ญ์์ผ๋ก nums
๋ฐฐ์ด์ ์ํํ๋ค๊ณ ์๊ฐํด๋ณด์. ๊บพ์ด๋ ์ง์ (๊ทธ๋ํ๊ฐ ์๋ก ์ฌ๋ผ๊ฐ๋ ์ง์ )์ด ๋ฐ๋ก ์ ๋ ฌ์ด ๋ง๋ฌด๋ฆฌ ๋์ด์ผ ํ๋ ์ง์ ์ด๋ค. ๊ทธ ๊บพ์ด๋ ์ง์ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ์ง๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค.
๊ฐ์ฅ ์์ ๊ฐ(์ดํ min
)์ ๊ฐ์ง๋ ์ธ๋ฑ์ค๋ฅผ ์ผ์ชฝ์ผ๋ก ์ญ ์ฎ๊ธด๋ค. ๊ทธ๋ํ๋ฅผ ๋ง๋ ๋๊น์ง. ๊ทธ๋ํ๋ฅผ ๋ง๋๋ ์ง์ ์ ์ธ๋ฑ์ค๊ฐ ์ ๋ ฌ์ ์์ํด์ผ ํ๋ ์ธ๋ฑ์ค๊ฐ ๋ ๊ฒ์ด๋ค. ๋ง์ฝ ๋ง๋์ง ์๋๋ค๋ฉด ์ธ๋ฑ์ค 0
, ์ฆ ๊ฐ์ฅ ์ฒซ๋ถ๋ถ์ด ์ ๋ ฌ์ ์์ํด์ผ ํ๋ ์ธ๋ฑ์ค๊ฐ ๋ ๊ฒ์ด๋ค.
๊ฐ์ฅ ํฐ ๊ฐ(์ดํ max
)์ ๊ฐ์ง๋ ์ธ๋ฑ์ค๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ญ ์ฎ๊ธด๋ค. ๊ทธ๋ํ๋ฅผ ๋ง๋ ๋๊น์ง. ๋ง์ฐฌ๊ฐ์ง๋ก ๊ทธ๋ํ๋ฅผ ๋ง๋๋ ์ง์ ์ ์ธ๋ฑ์ค๊ฐ ์ ๋ ฌ์ด ๋ง๋ฌด๋ฆฌ๋์ด์ผ ํ ์ง์ ์ด ๋ ๊ฒ์ด๋ค. ๋ง์ฝ ๋ง๋์ง ์๋๋ค๋ฉด ์ธ๋ฑ์ค๊ฐ nums.length - 1
, ์ฆ ๊ฐ์ฅ ๋๋ถ๋ถ์ด ์ ๋ ฌ์ด ๋ง๋ฌด๋ฆฌ ๋์ด์ผ ํ๋ ์ง์ ์ด ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฎ๊ธด ๋ ์ธ๋ฑ์ค์ ์ฐจ + 1์ ํด์ฃผ๋ฉด subArray์ ์ต์ ๊ธธ์ด๊ฐ ๋์ค๊ฒ ๋๋ค.
์์ , ์ง์ ์ ํ์ํฉ๋๋ค!
https://leetcode.com/problems/shortest-unsorted-continuous-subarray/