auto commit

This commit is contained in:
CyC2018 2018-03-13 22:32:22 +08:00
parent 539324d180
commit eaa85f8ff3

View File

@ -1903,25 +1903,44 @@ Output:
**解题思路**
可以用二分查找找出 num 在数组的最左端和最右端。
可以用二分查找找出数字在数组的最左端和最右端。
```java
public int GetNumberOfK(int[] array, int num) {
int l = 0, h = array.length - 1;
public int GetNumberOfK(int[] nums, int K) {
int first = getFirstK(nums, K);
int last = getLastK(nums, K);
return first == -1 || last == -1 ? 0 : last - first + 1;
}
private int getFirstK(int[] nums, int K) {
int l = 0, h = nums.length - 1;
while (l <= h) {
int m = l + (h - l) / 2;
if (array[m] >= num) h = m - 1;
if (nums[m] >= K) h = m - 1;
else l = m + 1;
}
int cnt = 0;
while (l < array.length && array[l++] == num) cnt++;
return cnt;
if (l > nums.length - 1 || nums[l] != K) return -1;
return l;
}
private int getLastK(int[] nums, int K) {
int l = 0, h = nums.length - 1;
while (l <= h) {
int m = l + (h - l) / 2;
if (nums[m] > K) h = m - 1;
else l = m + 1;
}
if (h < 0 || nums[h] != K) return -1;
return h;
}
```
## 54. 二叉搜索树的第 k 个结点
**解题思路**
利用二叉搜索数中序遍历有序的特点。
```java
TreeNode ret;
int cnt = 0;
@ -1982,6 +2001,12 @@ public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {
输入一个递增排序的数组和一个数字 S在数组中查找两个数是的他们的和正好是 S如果有多对数字的和等于 S输出两个数的乘积最小的。
**解题思路**
使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。
如果两个指针指向元素的和 sum == target那么得到要求的结果如果 sum > target移动较大的元素使 sum 变小一些;如果 sum < target移动较小的元素使 sum 变大一些
```java
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
int i = 0, j = array.length - 1;