剑指offer:在排序数组中查找数字(二分查找)

package com.yilan.leetcode;

public class Solution {

public static void main(String[] args) {
int[] data = {1,2,3,3,3,3,4,5};
int k = 6;
Solution so = new Solution();
System.out.println(so.GetNumberOfK(data, k));
}
public int GetNumberOfK(int [] data , int k) {
int number = 0;
int length = data.length;
// System.out.println("length: "+length);
int start = 0;
int end = length-1;
if (data != null && length > 0) {
int fist = GetFistK(data, length, k, start, end);
int last = GetLastK(data, length, k, start, end);
// System.out.println("fist: "+fist);
// System.out.println("last: "+last);
if (fist > -1 && last > -1) {
// System.out.println("fist: "+fist);
// System.out.println("last: "+last);
number = last - fist + 1;
}
}
return number;

}

/*
* 找到排序数组中的第一个K
*
*/
int GetFistK(int [] data , int length, int k,int start, int end) {
if (start > end) {
return -1;
}
int middleIndex = (start + end) / 2;
int middleData = data[middleIndex];
if (middleData == k) {
if ((middleIndex > 0 && data[middleIndex-1] != k) || middleIndex == 0) {
return middleIndex;
}else {
end = middleIndex - 1;
}
}
else if (middleData > k) {
end = middleIndex - 1;
}
else {
start = middleIndex + 1;
}

return GetFistK(data, length, k, start, end);

}

/*
* 找到排序数组的最后一个K
*/
int GetLastK(int [] data , int length, int k,int start, int end) {
if (start > end) {
return -1;
}
int middleIndex = (start + end) / 2;
int middleData = data[middleIndex];
if (middleData == k) {
if ((middleIndex < length-1 && data[middleIndex+1] != k) || middleIndex == length-1) {
return middleIndex;
}else {
start = middleIndex + 1;
}
}
else if (middleData > k) {
end = middleIndex - 1;
}
else {
start = middleIndex + 1;
}

return GetLastK(data, length, k, start, end);

}
}

posted @ 2021-08-08 20:16  行之星  阅读(66)  评论(0)    收藏  举报