数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数。

有序数组——二分法

  1. 考虑到递增和递减两种情况,用一个 flag 来表示,总结起来两个指针的移动有四种情况:
    k index1=mid-1;
    k index2=mid+1;
    k>array[mid]&&flag==true(递增)==> index2=mid+1;​
    k>array[mid]&&flag==false(递减)==> index1=mid-1;
    发现当 k
  2. 由于 mid 始终不能等于index2,当 index1 和 index2 相邻的时候,mid 需要先判断 array[index2]是否等于k,再返回
public class Solution {
	public int GetNumberOfK(int[] array, int k) {
        if(array.length==0)
            return 0;
		boolean flag = array[0] < array[array.length-1];
		int index1 = 0;
		int index2 = array.length-1;
		int count=0;
		while(index1<=index2) {
			int mid=(index1+index2)/2;
			if(k==array[mid]) {
				count++;
				int c=mid-1;
				while(c>=0&&k==array[c--]) {
					count++;
				}
				c=mid+1;
				while(c<array.length&&k==array[c++]) {
					count++;
				}
				break;
			}else if((k<array[mid])==flag) {
				index2=mid-1;
			}else if(!(k<array[mid])==flag) {
				index1=mid+1;
			}else if(mid==index1) {
				if(k==array[index2])
					return 1;
				else
					break;
			}
		}
		return count;
	}
}

你可能感兴趣的:(剑指offer)