Skip to content

Commit fd1e31b

Browse files
authored
Merge pull request #1713 from nancyel/main
[nancyel] WEEK 01 solutions
2 parents bfe145d + 52742bd commit fd1e31b

File tree

5 files changed

+103
-0
lines changed

5 files changed

+103
-0
lines changed

contains-duplicate/nancyel.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/**
2+
* time complexity: O(n)
3+
* space complexity: O(n)
4+
*/
5+
function containsDuplicate(nums: number[]): boolean {
6+
const seen = new Set();
7+
for (let num of nums) {
8+
if (seen.has(num)) {
9+
return true;
10+
}
11+
seen.add(num);
12+
}
13+
return false;
14+
}

house-robber/nancyel.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* time complexity: O(n) - iterate over a loop
3+
* space complexity: O(n) - dp array
4+
*
5+
* comment: initial naive implementation: simple odd/even alternation, which may return result that is "accidentally correct."
6+
*/
7+
function rob(nums: number[]): number {
8+
// early return
9+
if (nums.length === 0) return 0;
10+
if (nums.length === 1) return nums[0];
11+
12+
const dp: number[] = new Array(nums.length);
13+
dp[0] = nums[0];
14+
dp[1] = Math.max(nums[0], nums[1]);
15+
16+
for (let i = 2; i < nums.length; i++) {
17+
// select either 1) current + best from 2 houses ago or 2) skip current, best from previous
18+
dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1]);
19+
}
20+
21+
return dp[nums.length - 1]; // max money from all houses
22+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* requirement: return result in linear time (O(n))
3+
*/
4+
function longestConsecutive(nums: number[]): number {
5+
if (nums.length === 0) return 0;
6+
7+
const numSet = new Set(nums); // O(1) lookups
8+
let maxLength = 0;
9+
10+
for (const num of numSet) {
11+
// key: determine the "start" of a consecutive sequence.
12+
// approach: if num - 1 doesn't exist in the set → num is the start of a sequence.
13+
if (!numSet.has(num - 1)) {
14+
let currentNum = num;
15+
let currentLength = 1;
16+
17+
// count consecutive numbers
18+
while (numSet.has(currentNum + 1)) {
19+
currentNum++;
20+
currentLength++;
21+
}
22+
23+
maxLength = Math.max(maxLength, currentLength);
24+
}
25+
}
26+
return maxLength;
27+
}

top-k-frequent-elements/nancyel.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* time complexity: O(n + m log m),
3+
* n = length of input array
4+
* m = number of unique elements (m ≤ n)
5+
* space complexity: O(m)
6+
*/
7+
8+
function topKFrequent(nums: number[], k: number): number[] {
9+
const freqMap = new Map<number, number>();
10+
11+
// Count frequencies using a map: O(n)
12+
for (const num of nums) {
13+
freqMap.set(num, (freqMap.get(num) || 0) + 1);
14+
}
15+
16+
// Extract the top k elements
17+
return Array.from(freqMap.entries()) // O(m)
18+
.sort(([, a], [, b]) => b - a) // O(m log m)
19+
.slice(0, k)
20+
.map(([num]) => num); // extract the keys only
21+
}

two-sum/nancyel.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* Time Complexity: O(n) (using a single pass with a hash map)
3+
* (If a nested loop was used, it would be O(n^2))
4+
*/
5+
function twoSum(nums: number[], target: number): number[] {
6+
const numAndIndex = new Map<number, number>();
7+
8+
for (let i = 0; i < nums.length; i++) {
9+
const diff = target - nums[i];
10+
11+
if (numAndIndex.has(diff)) {
12+
return [numAndIndex.get(diff)!, i];
13+
}
14+
15+
numAndIndex.set(nums[i], i);
16+
}
17+
18+
return [];
19+
}

0 commit comments

Comments
 (0)