Skip to content

Commit aca38cb

Browse files
committed
140523
1 parent 5f45dcc commit aca38cb

File tree

6 files changed

+181
-101
lines changed

6 files changed

+181
-101
lines changed

.run/leetcode-debug.run.xml

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/Contest.java

Lines changed: 44 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,60 @@
1-
2-
import javafx.util.Pair;
3-
41
import java.util.*;
52

3+
import java.math.BigInteger;
64

75
class Solution {
8-
9-
TreeSet<Integer> indexes = new TreeSet<>();
10-
11-
public int[] colorTheArray(int n, int[][] queries) {
12-
// TreeMap<Integer, TreeSet<Integer>> timeline = new TreeMap<>();
13-
14-
15-
int[] values = new int[n];
16-
int[] jumps = new int[n];
17-
Arrays.fill(jumps, -1);
18-
int[] ans = new int[queries.length];
19-
for (int i = 0; i < queries.length; i++) {
20-
int index = queries[i][0];
21-
int value = queries[i][1];
22-
// if (values[index] != 0) {
23-
// timeline.get(values[index]).remove(index);
24-
// }
25-
values[index] = value;
26-
jumps[index] = index;
27-
if (index + 1 < n && values[index + 1] == value) {
28-
jumps[index + 1] = Math.min(index, jumps[index + 1]);
29-
jumps[index] = Math.min(index, jumps[index + 1]);
30-
}
31-
if (index > 0 && values[index - 1] == value) {
32-
jumps[index] = Math.min(jumps[index - 1], index);
6+
public boolean doesValidArrayExist(int[] derived) {
7+
if (derived.length == 1) return derived[0] == 0;
8+
int[] original = new int[derived.length];
9+
Arrays.fill(original, -1);
10+
for (int i = 0; i < derived.length; i++) {
11+
if (derived[i] == 0) {
12+
original[i] = 0;
13+
original[(i + 1) % derived.length] = 0;
3314
}
34-
35-
36-
indexes.add(index);
37-
ans[i] = count(jumps, values);
3815
}
39-
40-
41-
return ans;
42-
16+
return doesValidArrayExistHelper(0, derived, original);
4317
}
4418

45-
private int count(int[] jumps, int[] values) {
19+
public boolean doesValidArrayExistHelper(int i, int[] derived, int[] original) {
20+
if (i == derived.length) return true;
4621

47-
int ans = 0;
48-
int i = 0;
49-
while (i >= 0) {
50-
int value = values[i];
51-
int start = jumps[i];
52-
while (jumps[start] != start && values[start] == value) {
53-
start = jumps[start];
22+
if (derived[i] == 1) {
23+
if (original[i] == 0 && original[(i + 1) % derived.length] == 0) return false;
24+
if (original[i] == 0) {
25+
if (original[(i + 1) % derived.length] == 1) return false;
26+
original[(i + 1) % derived.length] = 0;
5427
}
55-
if (start != i) {
56-
ans += i - start;
28+
int before = (i - 1) < 0 ? derived.length - 1 : i - 1;
29+
int after = (i + 1) % derived.length;
30+
31+
32+
if (original[before] == 0 || original[after] == 0) {
33+
original[i] = 1;
34+
return doesValidArrayExistHelper(i + 1, derived, original);
35+
} else {
36+
// if (original[before] == -1) {
37+
// original[before] = 0;
38+
// original[i] = 1;
39+
// if (doesValidArrayExistHelper(i + 1, derived, original)) {
40+
// return true;
41+
// }
42+
// original[i] = -1;
43+
// original[before] = -1;
44+
// }
45+
if (original[after] == -1) {
46+
original[after] = 0;
47+
original[i] = 1;
48+
}
5749
}
58-
i = start - 1;
59-
}
60-
return ans;
61-
}
6250

51+
return doesValidArrayExistHelper(i + 1, derived, original);
52+
} else {
53+
return doesValidArrayExistHelper(i + 1, derived, original);
54+
}
6355

56+
}
6457
}
6558

6659
public class Contest extends Solution {
67-
}
68-
/**
69-
* class Node {
70-
* <p>
71-
* public Node next = null;
72-
* int val;
73-
* <p>
74-
* Node(int val) {
75-
* this.val = val;
76-
* }
77-
* <p>
78-
* Node(int val, Node next) {
79-
* this.val = val;
80-
* this.next = next;
81-
* }
82-
* }
83-
* <p>
84-
* class CustomLL {
85-
* <p>
86-
* Node head;
87-
* Node tail;
88-
* <p>
89-
* int this.
90-
* <p>
91-
* public void add(){
92-
* <p>
93-
* }
94-
* <p>
95-
* }
96-
*/
60+
}

src/Main.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import leetcode.editor.en.Q1035.UncrossedLines;
22
import leetcode.editor.en.Q1220.CountVowelsPermutation;
3+
import leetcode.editor.en.Q1259.HandshakesThatDontCross;
34
import leetcode.editor.en.Q1498.NumberOfSubsequencesThatSatisfyTheGivenSumCondition;
45
import leetcode.editor.en.Q1697.CheckingExistenceOfEdgeLengthLimitedPaths;
56
import leetcode.editor.en.Q1752.CheckIfArrayIsSortedAndRotated;
7+
import leetcode.editor.en.Q1799.MaximizeScoreAfterNOperations;
68
import leetcode.editor.en.Q188.BestTimeToBuyAndSellStockIv;
79
import leetcode.editor.en.Q1964.FindTheLongestValidObstacleCourseAtEachPosition;
810
import leetcode.editor.en.Q2466.CountWaysToBuildGoodStrings;
@@ -29,7 +31,8 @@
2931

3032
public class Main {
3133
public static void main(String[] args) throws IOException {
32-
System.out.println(new FourKeysKeyboard().maxA(9));
34+
35+
System.out.println(new MaximizeScoreAfterNOperations().maxScore(toIntArray("[370435,481435,953948,282360,691237,574616,638525,764832]\n")));
3336

3437
}
3538

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package leetcode.editor.en.Q1259;
2+
3+
import java.math.BigInteger;
4+
import java.util.*;
5+
6+
import javafx.util.Pair;
7+
8+
//leetcode submit region begin(Prohibit modification and deletion)
9+
class Solution {
10+
11+
BigInteger[] cache;
12+
13+
public int numberOfWays(int numPeople) {
14+
cache = new BigInteger[numPeople + 1];
15+
return numberOfWaysHelper(numPeople).mod(new BigInteger("1000000007")).intValue();
16+
}
17+
18+
19+
public BigInteger numberOfWaysHelper(int numPeople) {
20+
if (numPeople % 2 == 1) return new BigInteger("0");
21+
if (numPeople == 0) return new BigInteger("1");
22+
if (cache[numPeople] != null) return cache[numPeople];
23+
BigInteger ans = new BigInteger("0");
24+
25+
for (int i = 0; i < numPeople; i += 2) {
26+
BigInteger right = numberOfWaysHelper(numPeople - 2 - i);
27+
BigInteger left = numberOfWaysHelper(i);
28+
ans = ans.add(left.multiply(right));
29+
}
30+
cache[numPeople] = ans;
31+
return ans;
32+
}
33+
}
34+
//leetcode submit region end(Prohibit modification and deletion)
35+
36+
37+
public class HandshakesThatDontCross extends Solution {
38+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package leetcode.editor.en.Q1799;
2+
3+
import java.math.BigInteger;
4+
import java.util.*;
5+
6+
import javafx.util.Pair;
7+
8+
//leetcode submit region begin(Prohibit modification and deletion)
9+
class Solution {
10+
public int backtrack(int[] nums, int mask, int pairsPicked, int[] memo) {
11+
// If we have picked all the numbers from 'nums' array, we can't get more score.
12+
if (2 * pairsPicked == nums.length) {
13+
return 0;
14+
}
15+
16+
// If we already solved this sub-problem then return the stored result.
17+
if (memo[mask] != -1) {
18+
return memo[mask];
19+
}
20+
21+
int maxScore = 0;
22+
23+
// Iterate on 'nums' array to pick the first and second number of the pair.
24+
for (int firstIndex = 0; firstIndex < nums.length; ++firstIndex) {
25+
for (int secondIndex = firstIndex + 1; secondIndex < nums.length; ++secondIndex) {
26+
27+
// If the numbers are same, or already picked, then we move to next number.
28+
if (((mask >> firstIndex) & 1) == 1 || ((mask >> secondIndex) & 1) == 1) {
29+
continue;
30+
}
31+
32+
// Both numbers are marked as picked in this new mask.
33+
int newMask = mask | (1 << firstIndex) | (1 << secondIndex);
34+
35+
// Calculate score of current pair of numbers, and the remaining array.
36+
int currScore = (pairsPicked + 1) * gcd(nums[firstIndex], nums[secondIndex]);
37+
int remainingScore = backtrack(nums, newMask, pairsPicked + 1, memo);
38+
39+
// Store the maximum score.
40+
maxScore = Math.max(maxScore, currScore + remainingScore);
41+
// We will use old mask in loop's next interation,
42+
// means we discarded the picked number and backtracked.
43+
}
44+
}
45+
46+
// Store the result of the current sub-problem.
47+
memo[mask] = maxScore;
48+
return maxScore;
49+
}
50+
51+
public int maxScore(int[] nums) {
52+
int memoSize = 1 << nums.length; // 2^(nums array size)
53+
int[] memo = new int[memoSize];
54+
Arrays.fill(memo, -1);
55+
return backtrack(nums, 0, 0, memo);
56+
}
57+
58+
// Utility function to calculate the gcd of two numbers.
59+
public int gcd(int a, int b) {
60+
if (b == 0) {
61+
return a;
62+
}
63+
return gcd(b, a % b);
64+
}
65+
}
66+
//leetcode submit region end(Prohibit modification and deletion)
67+
68+
69+
public class MaximizeScoreAfterNOperations extends Solution {
70+
}

src/leetcode/editor/en/Q651/FourKeysKeyboard.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,32 @@ class Solution {
99

1010

1111
public int maxA(int n) {
12-
13-
}
14-
15-
public int maxAHelper(int n) {
16-
if (n == 0) {
17-
return 0;
18-
}
19-
int ans = 0;
20-
int bufferToDouble = maxAHelper(n - 3);
21-
if (n >= 3) {
22-
12+
int[][] dp = new int[n + 1][4];
13+
dp[0][1] = 1;
14+
dp[0][2] = 1;
15+
for (int i = 1; i <= n; i++) {
16+
int paste = dp[i - 1][1];
17+
int newBuffer = dp[i - 1][1];
18+
int previousBuffer = dp[i - 1][0];
19+
dp[i][0] = dp[i - 1][0] + paste;
20+
if (dp[i - 1][3] + dp[i - 1][2] >= dp[i][0]) { //If create a new buffer on previous step is better
21+
dp[i][0] = dp[i - 1][3] + dp[i - 1][2];
22+
paste = dp[i - 1][2];
23+
}
24+
25+
if (i - 3 >= 0) {
26+
newBuffer = dp[i - 3][0];
27+
previousBuffer = dp[i - 3][0];
28+
dp[i][3] = previousBuffer + newBuffer;
29+
if (previousBuffer + newBuffer >= dp[i][0]) {
30+
paste = newBuffer;
31+
}
32+
33+
}
34+
dp[i][1] = paste;
35+
dp[i][2] = newBuffer;
2336
}
37+
return dp[n][0];
2438
}
2539

2640

0 commit comments

Comments
 (0)