Wednesday, December 23, 2015
LeetCode [320] Generalized Abbreviation
LeetCode [321] Create Maximum Number
Sunday, December 20, 2015
Saturday, December 19, 2015
Friday, December 18, 2015
Survey [1] Cycle Detection
Method 1: Union-Find (Detect Cycle in a an Undirected Graph) [1]
Method 2: DFS (Detect Cycle in a an Directed Graph) [2]
Method 3: Coloring (Detect Cycle in a an Directed Graph) [3]
Ref[1] http://www.geeksforgeeks.org/union-find/
[2] http://www.geeksforgeeks.org/detect-cycle-in-a-graph/
[3] http://www.cs.cornell.edu/courses/cs2112/2012sp/lectures/lec24/lec24-12sp.html
Wednesday, December 16, 2015
MJ [49] Upsampling
you have an img data as an array, output the data for upsampling. For example,
[1, 2, 3, 4, 5, 6] as width 3(2 rows) ==> upsample 2 times would be [1 1 2 2 3 3 1 1 2 2 3 3 4 4 5 5 6 6 4 4 5 5 6 6]
================
================
Ref
[1] http://www.mitbbs.com/article_t/JobHunting/33110511.html
Monday, December 14, 2015
LeetCode [317] Shortest Distance from All Buildings
You want to build a house on an empty land which reaches all buildings in the shortest amount of distance. You can only move up, down, left and right. You are given a 2D grid of values 0, 1 or 2, where:
- Each 0 marks an empty land which you can pass by freely.
- Each 1 marks a building which you cannot pass through.
- Each 2 marks an obstacle which you cannot pass through.
Example:
Input: [[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]] 1 - 0 - 2 - 0 - 1 | | | | | 0 - 0 - 0 - 0 - 0 | | | | | 0 - 0 - 1 - 0 - 0 Output: 7 Explanation: Given three buildings at(0,0),(0,4),(2,2), and an obstacle at(0,2), the point(1,2)is an ideal empty land to build a house, as the total travel distance of 3+3+1=7 is minimal. So return 7.
Note:
There will be at least one building. If it is not possible to build such house according to the above rules, return -1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #define N 100 class Solution { public: int shortestDistance(vector<vector<int>>& grid) { int m = grid.size(); if(m==0) return 0; int n = grid[0].size(); if(n==0) return 0; int nb = 0;//count the number of buildings for(int i=0; i<m; ++i){ for(int j=0; j<n; ++j){ if(grid[i][j]==1){ nb++; } } } int ret = INT_MAX; bool found = false;//is true of there exists a valid place which can reach all buildings //check every cell if it is not an obstacle, grid[i][j]==0 or 1 //if grid[i][j]==0, this is an potential valid place //if grid[i][j]==1, check if we can reach all other buildings from [i][j]. If not, ie., there exists another buildings [i', j'] //such that grid[i'][j']==1 and [i, j] cannot reach [i', j'], thus, there mush not exist an valid place which can reach all buildings. for(int i=0; i<m; ++i){ for(int j=0; j<n; ++j){ if(grid[i][j]==2) continue;//cannot pass through an obstacle bool visited[N][N] = {false}; queue<vector<int>> que; int cnt = 0, dist = 0; vector<int> cor={i, j, 0};//row id, column id, current steps que.push(cor); visited[i][j] = true; while(!que.empty()){ int x = que.front()[0]; int y = que.front()[1]; int step = que.front()[2]; que.pop(); if(grid[x][y]==1){//found an buildings which can be reached from [i, j] in "step" steps cnt++; dist += step; } //continue bfs if 1) current place is empty; 2) current place is the original place if(grid[x][y]==0||(i==x && j==y)){ if(x-1>=0 && grid[x-1][y]<2 && !visited[x-1][y]){vector<int> v = {x-1, y, step+1}; que.push(v); visited[x-1][y] = true;}; if(x+1<m && grid[x+1][y]<2 && !visited[x+1][y]){vector<int> v = {x+1, y, step+1}; que.push(v); visited[x+1][y] = true;}; if(y-1>=0 && grid[x][y-1]<2 && !visited[x][y-1]){vector<int> v = {x, y-1, step+1}; que.push(v); visited[x][y-1] = true;}; if(y+1<n && grid[x][y+1]<2 && !visited[x][y+1]){vector<int> v = {x, y+1, step+1}; que.push(v); visited[x][y+1] = true;}; } } //[i, j] is a buildings and it cannot reach all other buildings. Return -1. if(grid[i][j]==1 && cnt<nb) return -1; //[i, j] is an empty place and it can reach all buildings. if(cnt==nb && grid[i][j]==0){ found = true; ret = min(ret, dist); } } } return found?ret:-1; } }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | public class Solution { public int shortestDistance(int[][] grid) { if (grid == null || grid[0].length == 0) return 0; final int[] shift = new int[] {0, 1, 0, -1, 0}; int row = grid.length, col = grid[0].length; int[][] distance = new int[row][col]; int[][] reach = new int[row][col]; int buildingNum = 0; for (int i = 0; i < row; i++) { for (int j =0; j < col; j++) { if (grid[i][j] == 1) { buildingNum++; Queue<int[]> myQueue = new LinkedList<int[]>(); myQueue.offer(new int[] {i,j}); boolean[][] isVisited = new boolean[row][col]; int level = 1; while (!myQueue.isEmpty()) { int qSize = myQueue.size(); for (int q = 0; q < qSize; q++) { int[] curr = myQueue.poll(); for (int k = 0; k < 4; k++) { int nextRow = curr[0] + shift[k]; int nextCol = curr[1] + shift[k + 1]; if (nextRow >= 0 && nextRow < row && nextCol >= 0 && nextCol < col && grid[nextRow][nextCol] == 0 && !isVisited[nextRow][nextCol]) { //The shortest distance from [nextRow][nextCol] to thic building // is 'level'. distance[nextRow][nextCol] += level; reach[nextRow][nextCol]++; isVisited[nextRow][nextCol] = true; myQueue.offer(new int[] {nextRow, nextCol}); } } } level++; } } } } int shortest = Integer.MAX_VALUE; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (grid[i][j] == 0 && reach[i][j] == buildingNum) { shortest = Math.min(shortest, distance[i][j]); } } } return shortest == Integer.MAX_VALUE ? -1 : shortest; } } |
Thursday, December 10, 2015
LeetCode [316] Remove Duplicate Letters
316. Remove Duplicate Letters
Given a string s, remove duplicate letters so that every letter appears once and only once. You must make sure your result is the smallest in lexicographical order among all possible results.
Note: This question is the same as 1081: https://leetcode.com/problems/smallest-subsequence-of-distinct-characters/
Example 1:
Input: s = "bcabc" Output: "abc"
Example 2:
Input: s = "cbacdcbc" Output: "acdb"
Constraints:
1 <= s.length <= 104sconsists of lowercase English letters.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Solution { public: string removeDuplicateLetters(string s) { if(s.empty()) return s; string ret; while(!s.empty()){ int cnts[26] = {0}; for(char c:s) cnts[c-'a']++; int pos = 0, n = s.size(); for(int i=0; i<n; ++i){ if(s[i]<s[pos]) pos = i; cnts[s[i]-'a']--; //find who's the first to disappear if(cnts[s[i]-'a']==0) break; } ret += s[pos]; string next; for(int i=pos+1; i<n; ++i){ if(s[i]!=s[pos]) next += s[i]; } s = next; } return ret; } }; |
Wednesday, December 9, 2015
LeetCode [315] Count of Smaller Numbers After Self
315. Count of Smaller Numbers After Self
You are given an integer array nums and you have to return a new counts array. The counts array has the property where counts[i] is the number of smaller elements to the right of nums[i].
Example 1:
Input: nums = [5,2,6,1] Output: [2,1,1,0] Explanation: To the right of 5 there are 2 smaller elements (2 and 1). To the right of 2 there is only 1 smaller element (1). To the right of 6 there is 1 smaller element (1). To the right of 1 there is 0 smaller element.
Constraints:
0 <= nums.length <= 10^5-10^4 <= nums[i] <= 10^4
//C++: 680ms Sort from the end class Solution { public: vector<int> countSmaller(vector<int>& nums) { int n = nums.size(); vector<int> ret(n, 0); for(int i=n-2; i>=0; --i){ int t = nums[i]; int j; for(j = i+1; j<n; ++j){ if(nums[j]>=t) break; } nums.insert(nums.begin()+j, t); nums.erase(nums.begin()+i); ret[i] = j-i-1; } return ret; } }; ]]></script> <script class="brush: js" type="syntaxhighlighter"><![CDATA[ //C++: 104ms binary search class Solution { public: vector<int> countSmaller(vector<int>& nums) { int n = nums.size(); vector<int> ret(n,0); for(int i=n-2; i>=0; --i){ int l = i+1, r = n-1, m; while(l<=r){ m = (l+r)/2; if((nums[m]>=nums[i] && nums[m-1]<nums[i])){ break; }else if(nums[m]>=nums[i]){ r = m-1; }else{ l = m+1; } } if(r<=i) m = i+1; if(l>=n) m = n; nums.insert(nums.begin()+m, nums[i]); nums.erase(nums.begin()+i); ret[i] = m-(i+1); } return ret; } }; ]]></script> <script class="brush: js" type="syntaxhighlighter"><![CDATA[ //C++: 100ms merge sort class Solution { vector<int> numbers; vector<int> ret; public: vector<int> merge(vector<int> leftIndices, vector<int> rightIndices){ int szl = leftIndices.size(); int szr = rightIndices.size(); int i = 0, j = 0, cnt = 0; vector<int> sortedIndices; while(i<szl && j<szr){ if(numbers[leftIndices[i]]<=numbers[rightIndices[j]]){ sortedIndices.push_back(leftIndices[i]); ret[leftIndices[i]] += cnt; i++; }else{ sortedIndices.push_back(rightIndices[j]); j++; cnt++; } } while(i<szl){ sortedIndices.push_back(leftIndices[i]); ret[leftIndices[i]] += cnt; i++; } while(j<szr){ sortedIndices.push_back(rightIndices[j]); j++; } return sortedIndices; } void divide(vector<int> &indices){ int n = indices.size(); if(n<2) return; int mid = n/2; vector<int> left(indices.begin(), indices.begin()+mid); vector<int> right(indices.begin()+mid, indices.end()); divide(left); divide(right); indices = merge(left, right); } vector<int> countSmaller(vector<int>& nums) { numbers = nums; int sz = nums.size(); ret.resize(sz, 0); vector<int> indices(sz); for(int i=0; i<sz; ++i){ indices[i] = i; } divide(indices); return ret; } };
//Java class Solution { public List<Integer> countSmaller(int[] nums) { int n = nums.length; List<Integer> list = new ArrayList<Integer>(); for(int v:nums) list.add(v); List<Integer> counts = new ArrayList<Integer>(n); for(int i=0; i<n; ++i) counts.add(0); //sort nums from right to left; for(int i=n-2; i>=0; --i){ int l = i+1, r = n-1; while(l<r){ int m = (l+r)/2; if(list.get(m)<list.get(i)){ l = m+1; }else{ r = m; } } if(list.get(l)<list.get(i)){ l = n; } list.add(l, list.get(i)); list.remove(i); counts.set(i, l-i-1); } return counts; } }
Tuesday, December 8, 2015
LeetCode [314] Binary Tree Vertical Order Traversal
Input: [3,9,20,null,null,15,7]
3
/\
/ \
9 20
/\
/ \
15 7
Output:
[
[9],
[3,15],
[20],
[7]
]
Input: [3,9,8,4,0,1,7]
3
/\
/ \
9 8
/\ /\
/ \/ \
4 01 7
Output:
[
[4],
[9],
[3,0,1],
[8],
[7]
]
Input: [3,9,8,4,0,1,7,null,null,null,2,5] (0's right child is 2 and 1's left child is 5)
3
/\
/ \
9 8
/\ /\
/ \/ \
4 01 7
/\
/ \
5 2
Output:
[
[4],
[9,5],
[3,0,1],
[8,2],
[7]
]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int>> verticalOrder(TreeNode* root) { int l = 0, r = 0; vector<vector<int>> ret; if(!root) return ret; ret.resize(1); queue<pair<TreeNode*, int>> que;//node. column index que.push(make_pair(root, 0)); while(!que.empty()) { TreeNode *node = que.front().first; int index = que.front().second; que.pop(); if(index<l) { l--; ret.insert(ret.begin(), vector<int>()); } else if(index>r) { r++; ret.insert(ret.end(), vector<int>()); } ret[index-l].push_back(node->val); if(node->left) que.push(make_pair(node->left, index-1)); if(node->right) que.push(make_pair(node->right, index+1)); } return ret; } }; |