NC139 孩子们的游戏
1、解题思路
基本的公式吧,多写几遍就好了。
2、代码
public class Solution {
public int LastRemaining_Solution(int n, int m) {
int p = 0;
for (int i = 2; i <= n; i++) {
p = (p + m) % i;
}
return p;
}
}
NC71 旋转数组的最小数字
1、解题思路
# 1、大致框架是二分,找到比数组最右边数的最小值,这种形式的二分还不会记住,尴尬
2、代码
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int l = 0;
int r = array.length - 1;
while (l < r) {
if (array[l] < array[r]) {
return array[l];
}
int mid = l + (r - l) / 2;
if (array[mid] > array[r]) {
l = mid + 1; // 找大了 右移
} else if (array[mid] < array[r]) {
r = mid; // 找小了 左移
} else {
r--; // 相等 r--
}
}
return array[l];
}
}
NC74 数字在升序数组中出现的次数
1、解题思路
两次二分解决。
2、代码
public class Solution {
private int findL(int[] array, int k) {
int ret = -1;
int l = 0;
int r = array.length - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (array[mid] == k) {
ret = mid;
r = mid - 1;
} else if (array[mid] < k) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return ret;
}
private int findR(int[] array, int k) {
int ret = -1;
int l = 0;
int r = array.length - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (array[mid] == k) {
ret = mid;
l = mid + 1;
} else if (array[mid] < k) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return ret;
}
public int GetNumberOfK(int[] array, int k) {
int l = findL(array, k);
if (l == -1) {
return 0;
}
int r = findR(array, k);
return r - l + 1;
}
}