Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 0550332

Browse files
committed
add more solutions (up to #230)
1 parent 695a055 commit 0550332

15 files changed

+505
-0
lines changed

solutions/146_LRUCache.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* @param {number} capacity
3+
*/
4+
var LRUCache = function(capacity) {
5+
this.capacity = capacity;
6+
this.map = new Map();
7+
};
8+
9+
/**
10+
* @param {number} key
11+
* @return {number}
12+
*/
13+
LRUCache.prototype.get = function(key) {
14+
let val = this.map.get(key)
15+
if(val == undefined){return -1;}
16+
//Map has sorted order. FIFO.
17+
this.map.delete(key);
18+
//we get value and push it to the back;
19+
this.map.set(key,val);
20+
return val;
21+
};
22+
23+
/**
24+
* @param {number} key
25+
* @param {number} value
26+
* @return {void}
27+
*/
28+
LRUCache.prototype.put = function(key, value) {
29+
//remove value if exists.
30+
if(this.map.has(key)){
31+
this.map.delete(key)
32+
}
33+
this.map.set(key,value);
34+
let keys = this.map.keys();
35+
while(this.map.size > this.capacity){
36+
//remove Least Recently Used elements
37+
this.map.delete(keys.next().value)
38+
}
39+
};
40+
41+
/**
42+
* Your LRUCache object will be instantiated and called as such:
43+
* var obj = new LRUCache(capacity)
44+
* var param_1 = obj.get(key)
45+
* obj.put(key,value)
46+
*/

solutions/148_SortList.js

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val) {
4+
* this.val = val;
5+
* this.next = null;
6+
* }
7+
*/
8+
/**
9+
* @param {ListNode} head
10+
* @return {ListNode}
11+
*/
12+
var sortList = function(head) {
13+
function mergeSort(node){
14+
if(!node || !node.next){
15+
return node;
16+
}
17+
let middle = getMiddle(node);
18+
let next_to_middle = middle.next;
19+
//divide in the middle;
20+
middle.next = null;
21+
let left = mergeSort(node)
22+
let right = mergeSort(next_to_middle);
23+
let merged_list = merge(left,right);
24+
return merged_list;
25+
}
26+
function merge(left,right){
27+
let result = null
28+
if(!left){
29+
return right;
30+
}
31+
if(!right){
32+
return left;
33+
}
34+
if(left.val<=right.val){
35+
result = new ListNode(left.val);
36+
result.next = merge(left.next,right)
37+
} else{
38+
result = new ListNode(right.val);
39+
result.next = merge(left,right.next);
40+
}
41+
return result;
42+
}
43+
44+
function getMiddle(node){
45+
if(!node){
46+
return null
47+
}
48+
let slow = node;
49+
let fast = node.next;
50+
// fast are moving 2 times faster. so when it comes to the end,
51+
// slow will be in the middle
52+
while(fast!=null){
53+
fast = fast.next;
54+
if(fast!=null){
55+
slow = slow.next;
56+
fast = fast.next;
57+
}
58+
}
59+
return slow;
60+
}
61+
return mergeSort(head)
62+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var findMin = function(nums) {
6+
let l_pointer = 0;
7+
let r_pointer = nums.length-1;
8+
while(l_pointer < r_pointer){
9+
let half = l_pointer + Math.floor((r_pointer-l_pointer)/2)
10+
if(nums[half] > nums[r_pointer]){
11+
l_pointer = half + 1
12+
} else {
13+
r_pointer = half
14+
}
15+
}
16+
return nums[l_pointer]
17+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution(object):
2+
def findMin(self, nums):
3+
"""
4+
:type nums: List[int]
5+
:rtype: int
6+
"""
7+
l_pointer = 0
8+
r_pointer = len(nums)-1
9+
while l_pointer < r_pointer:
10+
half = l_pointer + (r_pointer - l_pointer) // 2
11+
if nums[half] > nums[r_pointer]:
12+
l_pointer = half + 1
13+
else:
14+
r_pointer = half
15+
16+
return nums[l_pointer]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val) {
4+
* this.val = val;
5+
* this.next = null;
6+
* }
7+
*/
8+
9+
/**
10+
* @param {ListNode} headA
11+
* @param {ListNode} headB
12+
* @return {ListNode}
13+
*/
14+
var getIntersectionNode = function(headA, headB) {
15+
let head1 = headA;
16+
let head2 = headB;
17+
let result = null;
18+
19+
let count1 = getCount(head1);
20+
let count2 = getCount(head2);
21+
if(count1<count2){
22+
let diff = count2-count1;
23+
result = getIntersectionPoint(diff, head2, head1);
24+
} else{
25+
let diff = count1 - count2;
26+
result = getIntersectionPoint(diff, head1, head2);
27+
}
28+
29+
function getIntersectionPoint(diff, bigger, smaller){
30+
let current1 = bigger;
31+
let current2 = smaller;
32+
for(let i = 0; i<diff;i++){
33+
if(!current1){
34+
return null;
35+
}
36+
current1 = current1.next;
37+
}
38+
while(current1 && current2){
39+
if(current1 === current2){
40+
return current1
41+
}
42+
current1 = current1.next;
43+
current2 = current2.next;
44+
}
45+
46+
return null;
47+
}
48+
49+
50+
function getCount(head){
51+
let count = 0;
52+
let curr = head;
53+
while(curr){
54+
count = count+1;
55+
curr = curr.next;
56+
}
57+
return count;
58+
}
59+
return result;
60+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @param {number[]} numbers
3+
* @param {number} target
4+
* @return {number[]}
5+
*/
6+
var twoSum = function(numbers, target) {
7+
let left = 0;
8+
let right = numbers.length - 1;
9+
let dict = {}
10+
while(left<=right){
11+
if(numbers[left]+numbers[right]===target){
12+
return [left+1,right+1]
13+
} else if(numbers[left]+numbers[right]<target){
14+
left++
15+
} else {
16+
right--
17+
}
18+
}
19+
return []
20+
};
+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val) {
4+
* this.val = val;
5+
* this.left = this.right = null;
6+
* }
7+
*/
8+
/**
9+
* @param {TreeNode} root
10+
*/
11+
var BSTIterator = function(root) {
12+
function inorderTraversal(root){
13+
if(root){
14+
inorderTraversal(root.left)
15+
_ordered_nodes.push(root.val);
16+
inorderTraversal(root.right)
17+
}
18+
}
19+
let _ordered_nodes = [];
20+
inorderTraversal(root);
21+
this.ordered_nodes = _ordered_nodes;
22+
this.index = -1;
23+
};
24+
25+
/**
26+
* @return the next smallest number
27+
* @return {number}
28+
*/
29+
BSTIterator.prototype.next = function() {
30+
this.index = this.index+1;
31+
return this.ordered_nodes[this.index]
32+
};
33+
34+
/**
35+
* @return whether we have a next smallest number
36+
* @return {boolean}
37+
*/
38+
BSTIterator.prototype.hasNext = function() {
39+
return this.index+1 < this.ordered_nodes.length
40+
};
41+
42+
/**
43+
* Your BSTIterator object will be instantiated and called as such:
44+
* var obj = new BSTIterator(root)
45+
* var param_1 = obj.next()
46+
* var param_2 = obj.hasNext()
47+
*/
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val) {
4+
* this.val = val;
5+
* this.left = this.right = null;
6+
* }
7+
*/
8+
/**
9+
* @param {TreeNode} root
10+
* @return {number[]}
11+
*/
12+
var rightSideView = function(root) {
13+
var result = [];
14+
var max_level = [0]
15+
function helper(root, current_level, max_level){
16+
if(root){
17+
if(max_level[0] < current_level){
18+
result.push(root.val);
19+
max_level[0] = current_level
20+
}
21+
22+
// if right view : right -> left
23+
// if left view : left -> right
24+
helper(root.right, current_level + 1, max_level)
25+
helper(root.left, current_level + 1, max_level)
26+
}
27+
28+
}
29+
helper(root,1,max_level);
30+
return result
31+
};
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution(object):
9+
def rightSideView(self, root):
10+
"""
11+
:type root: TreeNode
12+
:rtype: List[int]
13+
"""
14+
max_level = [0]
15+
result = []
16+
self.helper(root, max_level, 1, result)
17+
return result
18+
19+
def helper(self, root, max_level, current_level, result):
20+
if root:
21+
if max_level[0] < current_level:
22+
result.append(root.val)
23+
max_level[0] = current_level
24+
25+
self.helper(root.right, max_level, current_level+1, result)
26+
self.helper(root.left, max_level, current_level+1, result)
27+

solutions/200_NumberofIslands.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @param {character[][]} grid
3+
* @return {number}
4+
*/
5+
var numIslands = function(grid) {
6+
let count = 0;
7+
function dfs(grid, i, j){
8+
if(i<0 || i >= grid.length || j < 0 || j >=grid[0].length || grid[i][j] != '1'){
9+
return;
10+
}
11+
grid[i][j] = '#' // mark as visited can be marked as 0
12+
dfs(grid,i+1,j);
13+
dfs(grid,i-1,j);
14+
dfs(grid,i,j+1);
15+
dfs(grid,i,j-1);
16+
}
17+
for(let i = 0;i<grid.length;i++){
18+
for(let j =0;j<grid[0].length;j++){
19+
if(grid[i][j]=='1'){
20+
dfs(grid,i,j)
21+
count = count + 1
22+
}
23+
}
24+
}
25+
return count
26+
};

solutions/200_NumberofIslands.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution(object):
2+
def numIslands(self, grid):
3+
"""
4+
:type grid: List[List[str]]
5+
:rtype: int
6+
"""
7+
result = 0
8+
for i in range(len(grid)):
9+
for j in range(len(grid[0])):
10+
if grid[i][j] == '1':
11+
self.dfs(grid,i,j)
12+
result += 1
13+
return result
14+
15+
def dfs(self,grid,i,j):
16+
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == '0':
17+
return
18+
19+
grid[i][j] = '0'
20+
self.dfs(grid, i + 1, j)
21+
self.dfs(grid, i-1, j)
22+
self.dfs(grid, i, j+1)
23+
self.dfs(grid, i , j-1)

0 commit comments

Comments
 (0)