1、统计一个数字在排序数组中出现的次数
自己想的办法:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length<1)
return 0;
int start=0;
int end=array.length-1;
while(start!=end)
{
if(array[start]<k)
start++;
if(array[end]>k)
end--;
if((array[start]==k) && (array[end]==k))
return end-start+1;
}
if(array.length==1 && array[0]==k)
return 1;
return 0;
}
}
巧妙利用两次二分查找,分别找出第一次出现的位置和最后一次出现的位置:
public class Solution {
public int findFirst(int [] array , int k)
{
int start=0;
int end=array.length-1;
int mid;
while(start<=end)
{
mid=(start+end)/2;
if(array[mid]<k)
start=mid+1;
else if(array[mid]>k)
end=mid-1;
else{
if(mid==0) return mid;
else if(array[mid-1]!=k) return mid;
else{
end=mid-1;
}
}
}
return -1;
}
public int findLast(int [] array , int k)
{
int start=0;
int end=array.length-1;
int mid;
while(start<=end)
{
mid=(start+end)/2;
if(array[mid]<k)
start=mid+1;
else if(array[mid]>k)
end=mid-1;
else{
if(mid==(array.length-1)) return mid;
else if(array[mid+1]!=k) return mid;
else{
start=mid+1;
}
}
}
return -1;
}
public int GetNumberOfK(int [] array , int k) {
int first=findFirst(array,k);
int last=findLast(array,k);
if(first==-1 && last==-1) return 0;
return last-first+1;
}
}
题目二:
public class test {
public static int binSearch1(int[] array)
{
int start=0;
int end=array.length-1;
int mid;
while(start<=end)
{
mid=(start+end)/2;
if(mid==array[mid])
{
start=mid+1;
}
else
{
//数在开头,顺序不能反,如果mid等于0在||后面,会造成数组越界
if( mid==0 || (mid-1)==array[mid-1])
return mid;
else
end=mid-1;
}
}
//数在末尾
if(start==array.length) return start;
}
public static void main(String[] args) {
int[] a1=new int[]{0,1,2,3};
System.out.println(binSearch1(a1));
}}
题目三
public class test {
public static int binSearch1(int[] array)
{
int start=0;
int end=array.length-1;
int mid;
while(start<=end)
{
mid=(start+end)>>1;
if(mid==array[mid])
{
return mid;
}
else if( mid<array[mid])
end=mid-1;
else
start=mid+1;
}
return -1;
}
public static void main(String[] args) {
int[] a1=new int[]{0,2,3,5};
System.out.println(binSearch1(a1));
}}