auto commit

This commit is contained in:
CyC2018 2018-04-03 15:05:11 +08:00
parent 7591a398df
commit 769ed707d9

View File

@ -2327,15 +2327,17 @@ Note that different sequences are counted as different combinations.
Therefore the output is 7.
```
完全背包。
```java
public int combinationSum4(int[] nums, int target) {
if (nums == null || nums.length == 0) return 0;
int[] dp = new int[target + 1];
dp[0] = 1;
for (int i = 1; i <= target; i++) {
for (int j = 0; j < nums.length; j++) {
if (nums[j] <= i) {
dp[i] += dp[i - nums[j]];
for (int num : nums) {
if (num <= i) {
dp[i] += dp[i - num];
}
}
}
@ -2343,30 +2345,13 @@ public int combinationSum4(int[] nums, int target) {
}
```
**只能进行两次的股票交易**
[Leetcode : 123. Best Time to Buy and Sell Stock III (Hard)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/)
```java
public int maxProfit(int[] prices) {
int firstBuy = Integer.MIN_VALUE, firstSell = 0;
int secondBuy = Integer.MIN_VALUE, secondSell = 0;
for (int curPrice : prices) {
if (firstBuy < -curPrice) firstBuy = -curPrice;
if (firstSell < firstBuy + curPrice) firstSell = firstBuy + curPrice;
if (secondBuy < firstSell - curPrice) secondBuy = firstSell - curPrice;
if (secondSell < secondBuy + curPrice) secondSell = secondBuy + curPrice;
}
return secondSell;
}
```
**只能进行 k 次的股票交易**
[Leetcode : 188. Best Time to Buy and Sell Stock IV (Hard)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/description/)
```html
dp[i, j] = max(dp[i, j-1], prices[j] - prices[jj] + dp[i-1, jj]) { jj in range of [0, j-1] } = max(dp[i, j-1], prices[j] + max(dp[i-1, jj] - prices[jj]))
dp[i, j] = max(dp[i, j-1], prices[j] - prices[jj] + dp[i-1, jj]) { jj in range of [0, j-1] }
= max(dp[i, j-1], prices[j] + max(dp[i-1, jj] - prices[jj]))
```
```java
@ -2392,6 +2377,24 @@ public int maxProfit(int k, int[] prices) {
}
```
**只能进行两次的股票交易**
[Leetcode : 123. Best Time to Buy and Sell Stock III (Hard)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/)
```java
public int maxProfit(int[] prices) {
int firstBuy = Integer.MIN_VALUE, firstSell = 0;
int secondBuy = Integer.MIN_VALUE, secondSell = 0;
for (int curPrice : prices) {
if (firstBuy < -curPrice) firstBuy = -curPrice;
if (firstSell < firstBuy + curPrice) firstSell = firstBuy + curPrice;
if (secondBuy < firstSell - curPrice) secondBuy = firstSell - curPrice;
if (secondSell < secondBuy + curPrice) secondSell = secondBuy + curPrice;
}
return secondSell;
}
```
### 数组区间
**数组区间和**
@ -2824,8 +2827,7 @@ public int countPrimes(int n) {
```java
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
return b == 0 ? a : gcd(b, a% b);
}
```
@ -2841,47 +2843,80 @@ int lcm(int a, int b){
对于 a 和 b 的最大公约数 f(a, b),有:
1\. 如果 a 和 b 均为偶数f(a, b) = 2\*f(a/2, b/2);
2\. 如果 a 是偶数 b 是奇数f(a, b) = f(a/2, b);
3\. 如果 b 是偶数 a 是奇数f(a, b) = f(a, b/2);
4\. 如果 a 和 b 均为奇数f(a, b) = f(a, a-b);
- 如果 a 和 b 均为偶数f(a, b) = 2\*f(a/2, b/2);
- 如果 a 是偶数 b 是奇数f(a, b) = f(a/2, b);
- 如果 b 是偶数 a 是奇数f(a, b) = f(a, b/2);
- 如果 a 和 b 均为奇数f(a, b) = f(a, a-b);
乘 2 和除 2 都可以转换为移位操作。
### 进制转换
Java 中 static String toString(int num, int radix) 可以将一个整数装换为 redix 进制表示的字符串。
**7 进制**
[Leetcode : 504. Base 7 (Easy)](https://leetcode.com/problems/base-7/description/)
```java
public String convertToBase7(int num) {
if (num < 0) {
return '-' + convertToBase7(-num);
}
if (num < 7) {
return num + "";
}
if (num < 0) return '-' + convertToBase7(-num);
if (num < 7) return num + "";
return convertToBase7(num / 7) + num % 7;
}
```
```java
public String convertToBase7(int num) {
if (num == 0) return "0";
StringBuilder sb = new StringBuilder();
boolean isNegative = num < 0;
if (isNegative) num = -num;
while (num > 0) {
sb.append(num % 7);
num /= 7;
}
String ret = sb.reverse().toString();
return isNegative ? "-" + ret : ret;
}
```
Java 中 static String toString(int num, int radix) 可以将一个整数转换为 redix 进制表示的字符串。
```java
public String convertToBase7(int num) {
return Integer.toString(num, 7);
}
```
**16 进制**
[Leetcode : 405. Convert a Number to Hexadecimal (Easy)](https://leetcode.com/problems/convert-a-number-to-hexadecimal/description/)
负数要用它的补码形式。
```html
Input:
26
Output:
"1a"
Input:
-1
Output:
"ffffffff"
```
```java
public String toHex(int num) {
char[] map = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
if(num == 0) return "0";
String ret = "";
StringBuilder sb = new StringBuilder();
while(num != 0){
ret = map[(num & 0b1111)] + ret;
num >>>= 4;
sb.append(map[num & 0b1111]);
num >>>= 4; // 无符号右移,左边填 0
}
return ret;
return sb.reverse().toString();
}
```
@ -2918,15 +2953,14 @@ Return "100".
```java
public String addBinary(String a, String b) {
int i = a.length() - 1, j = b.length() - 1, carry = 0;
String str = "";
while(i >= 0 || j >= 0){
StringBuilder str = new StringBuilder();
while (carry == 1 || i >= 0 || j >= 0) {
if (i >= 0 && a.charAt(i--) == '1') carry++;
if (j >= 0 && b.charAt(j--) == '1') carry++;
str = (carry % 2) + str;
str.append(carry % 2);
carry /= 2;
}
if(carry == 1) str = "1" + str;
return str;
return str.reverse().toString();
}
```
@ -2938,15 +2972,15 @@ public String addBinary(String a, String b) {
```java
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
int carry = 0;
for(int i = num1.length() - 1, j = num2.length() - 1; i >= 0 || j >= 0 || carry == 1; i--, j--){
int x = i < 0 ? 0 : num1.charAt(i) - '0';
int y = j < 0 ? 0 : num2.charAt(j) - '0';
sb.append((x + y + carry) % 10);
StringBuilder str = new StringBuilder();
int carry = 0, i = num1.length() - 1, j = num2.length() - 1;
while (carry == 1 || i >= 0 || j >= 0) {
int x = i < 0 ? 0 : num1.charAt(i--) - '0';
int y = j < 0 ? 0 : num2.charAt(j--) - '0';
str.append((x + y + carry) % 10);
carry = (x + y + carry) / 10;
}
return sb.reverse().toString();
return str.reverse().toString();
}
```