Skip to content

Commit 6a694ae

Browse files
Merge pull request chihungyu1116#4 from ignacio-chiazzo/master
Added another solution to Permutation ||
2 parents f6903cc + 13b5dbd commit 6a694ae

File tree

5 files changed

+149
-26
lines changed

5 files changed

+149
-26
lines changed

114 Flatten Binary Tree to Linked List.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,44 @@
1616
var flatten = function(root) {
1717
var stack = [];
1818
var p = root;
19-
19+
2020
while(p !== null || stack.length !== 0){
2121
if(p.right !== null){
2222
stack.push(p.right);
2323
}
24-
24+
2525
if(p.left !== null){ // [!!!]point of confusing, if null then pop stack
2626
p.right = p.left;
2727
p.left = null;
2828
} else if(stack.length !== 0){
2929
var node = stack.pop();
3030
p.right = node;
3131
}
32-
32+
3333
p = p.right;
3434
}
3535
};
3636

37+
// Recursive solution
38+
39+
var flatten = function(root) {
40+
if(root === null || (root.left === null && root.right === null)) {
41+
return;
42+
}
43+
44+
var rootLeft = root.left;
45+
var rootRight = root.right;
46+
root.left = null;
47+
root.right = null;
48+
49+
flatten(rootLeft);
50+
flatten(rootRight);
51+
52+
root.right = rootLeft;
53+
54+
var aux = root;
55+
while(aux !== null && aux.right !== null) {
56+
aux = aux.right;
57+
}
58+
aux.right = rootRight;
59+
};

39 Combination Sum.js

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
// Note:
66
// All numbers (including target) will be positive integers.
77
// The solution set must not contain duplicate combinations.
8-
// For example, given candidate set [2, 3, 6, 7] and target 7,
9-
// A solution set is:
8+
// For example, given candidate set [2, 3, 6, 7] and target 7,
9+
// A solution set is:
1010
// [
1111
// [7],
1212
// [2, 2, 3]
@@ -24,37 +24,61 @@
2424
*/
2525
var combinationSum = function(candidates, target) {
2626
var result = [];
27-
27+
2828
if(candidates === null || candidates.length === 0){
2929
return result;
3030
}
31-
31+
3232
candidates.sort(function(a,b){return a > b ? 1 : -1});
33-
33+
3434
var output = [];
35-
35+
3636
generate(candidates, result, output, target, 0);
37-
37+
3838
return result;
3939
};
4040

4141
var generate = function(candidates, result, output, sum, index){
4242
if(sum === 0){
43-
result.push(output.slice());
43+
result.push(output.slice());
4444
}
4545
if(sum < 0){
4646
return;
4747
}
48-
48+
4949
for(var i = index; i < candidates.length; i++){
5050
if(i > index && candidates[i] === candidates[i - 1]){
5151
continue;
5252
}
53-
53+
5454
if(candidates[i] <= sum){
5555
output.push(candidates[i]);
5656
generate(candidates, result, output, sum - candidates[i], i);
5757
output.pop();
5858
}
5959
}
60-
}
60+
}
61+
62+
63+
// Another solution
64+
var combinationSum = function(candidates, target) {
65+
var results = [];
66+
comb(candidates.sort(), 0, [], 0, target, results);
67+
return results;
68+
};
69+
70+
var comb = function(cand, index, partial, partialSum, target, results) {
71+
if(target === partialSum) {
72+
results.push(partial);
73+
return;
74+
}
75+
if(cand.length === index || partialSum > target) {
76+
return;
77+
}
78+
79+
comb(cand, index + 1, partial, partialSum, target, results);
80+
comb(cand, index, partial.concat([cand[index]].concat([cand[index]])),
81+
partialSum + 2* cand[index], target, results);
82+
comb(cand, index + 1, partial.concat([cand[index]]),
83+
partialSum + cand[index], target, results);
84+
};

47 Permutations II.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,32 @@ var generatePermute = function(nums, step, currentResult, visited, finalResult)
5050
visited[i] = false;
5151
}
5252
}
53-
}
53+
}
54+
55+
//Another Solution, similar approach that Permutation.js
56+
var permuteUnique = function(nums) {
57+
return permut(nums.sort(), []);
58+
};
59+
60+
var permut = function(nums, partial) {
61+
if(nums.length === 0) {
62+
return [partial];
63+
}
64+
var listSol = [];
65+
for(var i = 0; i < nums.length; i++) {
66+
var endRepeated = i;
67+
while(endRepeated < nums.length && nums[i] === nums[endRepeated]) {
68+
endRepeated++;
69+
}
70+
71+
var arrayWithoutI = nums.slice(0,i).concat(nums.slice(i + 1, nums.length));
72+
var partialSol = partial.concat([nums[i]]);
73+
var sol = permut(arrayWithoutI, partialSol);
74+
if(sol.length > 0){
75+
listSol = listSol.concat(sol);
76+
}
77+
i = endRepeated - 1;
78+
}
79+
return listSol;
80+
};
81+

48 Rotate Image.js

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@
1111
*/
1212
var rotate = function(matrix) {
1313
var row = matrix.length;
14-
14+
1515
if(row === 0) {
1616
return;
1717
}
18-
18+
1919
var col = matrix[0].length;
20-
20+
2121
// swap them in diagonal
2222
for(var i = 0; i < row; i++) {
2323
for(var j = 0; j < col - i; j++) {
2424
swap(matrix, i, j, row - 1 - j, col - 1 - i);
2525
}
2626
}
27-
27+
2828
// swap in middle
2929
for(i = 0; i < Math.floor(row/2); i++) {
3030
for(j = 0; j < col; j++) {
@@ -37,4 +37,37 @@ function swap(matrix, x1, y1, x2, y2) {
3737
var tmp = matrix[x1][y1];
3838
matrix[x1][y1] = matrix[x2][y2];
3939
matrix[x2][y2] = tmp;
40-
}
40+
}
41+
42+
//Clearer Solution
43+
var rotate = function(matrix) {
44+
rotateColumns(matrix);
45+
rotateEachDiagonal(matrix);
46+
};
47+
48+
var rotateColumns = function(matrix) {
49+
for(var j = 0; j < matrix.length; j++) {
50+
var low = 0;
51+
var ceil = matrix.length -1;
52+
while(low < ceil) {
53+
swap(matrix, low, j, ceil, j);
54+
low++;
55+
ceil--;
56+
}
57+
}
58+
};
59+
60+
var rotateEachDiagonal = function(matrix){
61+
for(var i = 0; i < matrix.length; i++) {
62+
for(var j = i; j < matrix.length; j++) {
63+
swap(matrix, i, j, j, i);
64+
}
65+
}
66+
};
67+
68+
var swap = function(matrix, i1, j1, i2, j2) {
69+
var aux = matrix[i1][j1];
70+
matrix[i1][j1] = matrix[i2][j2];
71+
matrix[i2][j2] = aux;
72+
};
73+

78 Subsets.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var generate = function(nums, index, cur, result) {
3232
result.push(cur.slice());
3333
return
3434
}
35-
35+
3636
generate(nums, index + 1, cur, result);
3737
cur.push(nums[index]);
3838
generate(nums, index + 1, cur, result);
@@ -42,11 +42,9 @@ var generate = function(nums, index, cur, result) {
4242

4343

4444
// second try
45-
46-
4745
var subsets = function(nums) {
4846
var res = [[]];
49-
47+
5048
function generate(nums, i, cur, res) {
5149
for(; i < nums.length; i++) {
5250
cur.push(nums[i]);
@@ -55,7 +53,24 @@ var subsets = function(nums) {
5553
cur.pop();
5654
}
5755
}
58-
56+
5957
generate(nums, 0, [], res);
6058
return res;
61-
};
59+
};
60+
61+
// Third solution
62+
var subsets = function(nums) {
63+
var results = [];
64+
combine(nums, 0, [], results);
65+
return results;
66+
}
67+
68+
var combine = function(nums, index, partial, results) {
69+
if(index === nums.length) {
70+
results.push(partial);
71+
return;
72+
}
73+
74+
combine(nums, index + 1, partial, results);
75+
combine(nums, index + 1, partial.concat([nums[index]]), results);
76+
}

0 commit comments

Comments
 (0)