Skip to content

Commit 130c3df

Browse files
authored
Merge pull request DaleStudy#114 from nhistory/week6
[Sehwan] Week6 solutions with javascript
2 parents ad4b80a + d0ad48a commit 130c3df

File tree

5 files changed

+133
-0
lines changed

5 files changed

+133
-0
lines changed

container-with-most-water/nhistory.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var maxArea = function (height) {
2+
// Two pointer: left and right
3+
// Amount of water: math.Min(height[left], height[right]) * (right-left)
4+
5+
// Exception case
6+
if (height.length === 0) return 0;
7+
8+
let left = 0;
9+
let right = height.length - 1;
10+
let result = 0;
11+
12+
// Iterate to find maxiume amount of water
13+
while (left < right) {
14+
const amount = Math.min(height[left], height[right]) * (right - left);
15+
result = Math.max(result, amount);
16+
height[left] <= height[right] ? left++ : right--;
17+
}
18+
19+
return result;
20+
};
21+
22+
// TC: O(n)
23+
// SC: O(1)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var findMin = function (nums) {
6+
// Make two pointer to find out mid index point and compare values
7+
let left = 0,
8+
right = nums.length - 1;
9+
10+
// If left value of nums is smaller than right value, return left value
11+
if (nums[left] < nums[right]) return nums[left];
12+
13+
while (left < right) {
14+
const mid = Math.floor((left + right) / 2);
15+
16+
// If mid value is greater than last value, left pointer move into next index of mid
17+
if (nums[mid] > nums[right]) left = mid + 1;
18+
// Else change right pointer into mid index
19+
else right = mid;
20+
}
21+
return nums[left];
22+
};
23+
24+
// TC: O(log n)
25+
// SC: O(1)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
var characterReplacement = function (s, k) {
2+
// Create two pointer to check repeating chracter (left, right)
3+
let left = 0,
4+
right = 0,
5+
maxCount = 0,
6+
map = new Map();
7+
8+
while (right < s.length) {
9+
// Save each character into map and check how many time they have
10+
map.set(s[right], map.get(s[right]) ? map.get(s[right]) + 1 : 1);
11+
maxCount = Math.max(maxCount, map.get(s[right]));
12+
13+
// Count (right-left+1-k) and compare maximum value
14+
if (right - left + 1 - k > maxCount) {
15+
// Decrement value of map[s[left]] and move left pointer
16+
map.set(s[left], map.get(s[left]) - 1);
17+
left++;
18+
}
19+
20+
right++;
21+
}
22+
23+
return right - left;
24+
};
25+
26+
// TC: O(n)
27+
// SC: O(1)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
var lengthOfLongestSubstring = function (s) {
2+
// Create map to store character from string
3+
let map = new Map();
4+
let maxLen = 0;
5+
let start = 0;
6+
7+
for (let end = 0; end < s.length; end++) {
8+
if (map.has(s[end])) {
9+
// Move the start pointer to the right of the previous position of current character
10+
start = Math.max(map.get(s[end]) + 1, start);
11+
}
12+
map.set(s[end], end);
13+
maxLen = Math.max(maxLen, end - start + 1);
14+
}
15+
return maxLen;
16+
};
17+
18+
// TC: O(n)
19+
// SC: O(n)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
var search = function (nums, target) {
2+
// Exception case
3+
if (nums.length === 0) return -1; // There is no element in nums
4+
if (nums.length === 1) {
5+
return nums[0] === target ? 0 : -1;
6+
}
7+
8+
// Create two pointer: left,right and mid, left = 0, right = nums.length-1
9+
let left = 0,
10+
right = nums.length - 1;
11+
12+
while (left <= right) {
13+
const mid = Math.floor((left + right) / 2);
14+
15+
if (nums[left] === target) return left;
16+
if (nums[right] === target) return right;
17+
if (nums[mid] === target) return mid;
18+
19+
// If left part is sorted, move pointer depends on target position
20+
if (nums[left] <= nums[mid]) {
21+
if (nums[left] <= target && target < nums[mid]) {
22+
right = mid - 1;
23+
} else {
24+
left = mid + 1;
25+
}
26+
// If right part is sorted, move pointer depends on target position
27+
} else {
28+
if (nums[mid] < target && target <= nums[right]) {
29+
left = mid + 1;
30+
} else {
31+
right = mid - 1;
32+
}
33+
}
34+
}
35+
return -1;
36+
};
37+
38+
// TC: O(log n)
39+
// SC: O(1)

0 commit comments

Comments
 (0)