题目一
public class Solution53_1 {
public static void main(String[] args) {
int[] array = {1,2,3,3,3,3,4,5};
int numberOfKBinarySearch = getNumberOfKBinarySearchThrid(array, 3);
System.out.println(numberOfKBinarySearch);
}
public static int getNumberOfK(int [] array , int k) {
if (array == null || array.length == 0){
return -1;
}
int count = 0;
for (int j : array) {
if (j == k){
count++;
}
}
return count;
}
public static int getNumberOfKBinarySearch(int [] array , int k) {
if (array == null || array.length == 0){
return -1;
}
int index = binarySearch(array, k, 0, array.length - 1);
if (index < 0){
return -1;
}
int count = 1;
for (int i = index-1; i >= 0; i--) {
if (array[i] == k){
count++;
}else {
break;
}
}
for (int i = index+1; i < array.length; i++) {
if (array[i] == k){
count++;
}else {
break;
}
}
return count;
}
public static int binarySearch(int[] array, int target, int left, int right){
if (left > right){
return -1;
}
while (left < right){
int mid = (left + right) / 2;
if (array[mid] > target){
right = mid - 1;
}else if (array[mid] < target){
left = mid + 1;
}else {
return mid;
}
}
return -1;
}
public static int getNumberOfKBinarySearchThrid(int [] array , int k) {
if (array == null || array.length == 0){
return -1;
}
int fristK = getFristK(array,k,0,array.length-1);
int lastK = getLastK(array,k,0,array.length-1);
return lastK - fristK + 1;
}
public static int getFristK(int [] array,int k, int left, int right){
if (left > right){
return -1;
}
int mid = (left + right) / 2;
if (array[mid] > k){
right = mid - 1;
}else if (array[mid] < k){
left = mid + 1;
}else {
if ((mid > 0 && array[mid - 1] != k) || mid == 0){
return mid;
}else {
right = mid - 1;
}
}
return getFristK(array,k,left,right);
}
public static int getLastK(int [] array,int k, int left, int right){
if (left > right){
return -1;
}
int mid = (left + right) / 2;
if (array[mid] > k){
right = mid - 1;
}else if (array[mid] < k){
left = mid + 1;
}else {
if ((mid < array.length-1 && array[mid + 1] != k) || mid == array.length-1){
return mid;
}else {
left = mid + 1;
}
}
return getLastK(array,k,left,right);
}
}
题目二及题目三
import org.junit.Test;
public class Solution53_2 {
public static void main(String[] args) {
int[] array = {0,1,2,3,5};
int missingNumber = getMissingNumber(array);
System.out.println(missingNumber);
}
public static int getMissingNumber(int[] array){
if (array == null || array.length == 0){
return -1;
}
int left = 0;
int right = array.length-1;
while (left <= right){
int mid = (left + right) / 2;
if (array[mid] != mid){
if (mid == 0 || array[mid - 1] == mid - 1){
return mid;
}
right = mid - 1;
}else {
left = mid + 1;
}
}
return -1;
}
@Test
public void test(){
int[] array = {-3,-1,1,3,5};
int numberSameAsIndex = getNumberSameAsIndex(array);
System.out.println(numberSameAsIndex);
}
public static int getNumberSameAsIndex(int[] number){
if (number == null || number.length == 0){
return -1;
}
int left = 0;
int right = number.length - 1;
while (left <= right){
int mid = (left + right) / 2;
if (number[mid] > mid){
right = mid - 1;
}else if (number[mid] < mid){
left = mid + 1;
}else {
return mid;
}
}
return -1;
}
}