mirror of
https://github.com/CyC2018/CS-Notes.git
synced 2025-07-07 09:25:01 +08:00
auto commit
This commit is contained in:
@ -1535,7 +1535,7 @@ public int getTranslationCount(String number) {
|
|||||||
|
|
||||||
**题目描述**
|
**题目描述**
|
||||||
|
|
||||||
在一个 m * n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘
|
在一个 m\*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘
|
||||||
|
|
||||||
```
|
```
|
||||||
1 10 3 8
|
1 10 3 8
|
||||||
@ -1576,16 +1576,16 @@ public int getMaxValue(int[][] values) {
|
|||||||
public int longestSubStringWithoutDuplication(String str) {
|
public int longestSubStringWithoutDuplication(String str) {
|
||||||
int curLen = 0;
|
int curLen = 0;
|
||||||
int maxLen = 0;
|
int maxLen = 0;
|
||||||
int[] position = new int[26];
|
int[] indexs = new int[26];
|
||||||
for (int i = 0; i < str.length(); i++) {
|
for (int i = 0; i < str.length(); i++) {
|
||||||
int c = str.charAt(i) - 'a';
|
int c = str.charAt(i) - 'a';
|
||||||
int preIndex = position[c];
|
int preIndex = indexs[c];
|
||||||
if (preIndex == -1 || i - preIndex > curLen) curLen++;
|
if (preIndex == -1 || i - preIndex > curLen) curLen++;
|
||||||
else {
|
else {
|
||||||
maxLen = Math.max(maxLen, curLen);
|
maxLen = Math.max(maxLen, curLen);
|
||||||
curLen = i - preIndex;
|
curLen = i - preIndex;
|
||||||
}
|
}
|
||||||
position[c] = i;
|
indexs[c] = i;
|
||||||
}
|
}
|
||||||
maxLen = Math.max(maxLen, curLen);
|
maxLen = Math.max(maxLen, curLen);
|
||||||
return maxLen;
|
return maxLen;
|
||||||
@ -1599,21 +1599,21 @@ public int longestSubStringWithoutDuplication(String str) {
|
|||||||
把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。 习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。
|
把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。 习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public int GetUglyNumber_Solution(int index) {
|
public int GetUglyNumber_Solution(int N) {
|
||||||
if (index <= 6) return index;
|
if (N <= 6) return N;
|
||||||
int i2 = 0, i3 = 0, i5 = 0;
|
int i2 = 0, i3 = 0, i5 = 0;
|
||||||
int cnt = 1;
|
int cnt = 1;
|
||||||
int[] dp = new int[index];
|
int[] dp = new int[N];
|
||||||
dp[0] = 1;
|
dp[0] = 1;
|
||||||
while (cnt < index) {
|
while (cnt < N) {
|
||||||
int n2 = dp[i2] * 2, n3 = dp[i3] * 3, n5 = dp[i5] * 5;
|
int n2 = dp[i2] * 2, n3 = dp[i3] * 3, n5 = dp[i5] * 5;
|
||||||
int tmp = Math.min(n2, Math.min(n3, n5));
|
int min = Math.min(n2, Math.min(n3, n5));
|
||||||
dp[cnt++] = tmp;
|
dp[cnt++] = min;
|
||||||
if (tmp == n2) i2++;
|
if (min == n2) i2++;
|
||||||
if (tmp == n3) i3++;
|
if (min == n3) i3++;
|
||||||
if (tmp == n5) i5++;
|
if (min == n5) i5++;
|
||||||
}
|
}
|
||||||
return dp[index - 1];
|
return dp[N - 1];
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -1632,40 +1632,40 @@ public int FirstNotRepeatingChar(String str) {
|
|||||||
|
|
||||||
**题目描述**
|
**题目描述**
|
||||||
|
|
||||||
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数 P。
|
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数 P。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
private long cnt = 0;
|
private long cnt = 0;
|
||||||
|
private int[] tmp; // 在这里创建辅助数组,而不是在 merge() 递归函数中创建
|
||||||
|
|
||||||
public int InversePairs(int[] array) {
|
public int InversePairs(int[] nums) {
|
||||||
mergeSortUp2Down(array, 0, array.length - 1);
|
tmp = new int[nums.length];
|
||||||
|
mergeSortUp2Down(nums, 0, nums.length - 1);
|
||||||
return (int) (cnt % 1000000007);
|
return (int) (cnt % 1000000007);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mergeSortUp2Down(int[] a, int start, int end) {
|
private void mergeSortUp2Down(int[] nums, int start, int end) {
|
||||||
if (end - start < 1) return;
|
if (end - start < 1) return;
|
||||||
int mid = start + (end - start) / 2;
|
int mid = start + (end - start) / 2;
|
||||||
mergeSortUp2Down(a, start, mid);
|
mergeSortUp2Down(nums, start, mid);
|
||||||
mergeSortUp2Down(a, mid + 1, end);
|
mergeSortUp2Down(nums, mid + 1, end);
|
||||||
merge(a, start, mid, end);
|
merge(nums, start, mid, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void merge(int[] a, int start, int mid, int end) {
|
private void merge(int[] nums, int start, int mid, int end) {
|
||||||
int[] tmp = new int[end - start + 1];
|
int i = start, j = mid + 1, k = start;
|
||||||
int i = start, j = mid + 1, k = 0;
|
|
||||||
while (i <= mid || j <= end) {
|
while (i <= mid || j <= end) {
|
||||||
if (i > mid) tmp[k] = a[j++];
|
if (i > mid) tmp[k] = nums[j++];
|
||||||
else if (j > end) tmp[k] = a[i++];
|
else if (j > end) tmp[k] = nums[i++];
|
||||||
else if (a[i] < a[j]) tmp[k] = a[i++];
|
else if (nums[i] < nums[j]) tmp[k] = nums[i++];
|
||||||
else {
|
else {
|
||||||
tmp[k] = a[j++];
|
tmp[k] = nums[j++];
|
||||||
this.cnt += mid - i + 1; // a[i] > a[j] ,说明 a[i...mid] 都大于 a[j]
|
this.cnt += mid - i + 1; // a[i] > a[j],说明 a[i...mid] 都大于 a[j]
|
||||||
}
|
}
|
||||||
k++;
|
k++;
|
||||||
}
|
}
|
||||||
|
for (k = start; k <= end; k++) {
|
||||||
for (k = 0; k < tmp.length; k++) {
|
nums[k] = tmp[k];
|
||||||
a[start + k] = tmp[k];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
Reference in New Issue
Block a user