[Sword refers to offer] 53. The number of times the number appears in the sorted array

Title description

Insert picture description here

Insert picture description here

// 53. 数字在排序数组中出现的次数

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

// 牛客
// 统计一个数字在升序数组中出现的次数。

answer

// 二分查找 

// 牛客
// 二分查找法,构建二分查找函数binarysearch,
// binarysearch函数,输入arr和k,通过二分查找方法找到k数字(的重复集),
// 并返回k数字(的重复集)末端的下一位索引。
// 具体情况:arr首端索引left,arr末端索引right,对半找中点索引
// mid = (left + right) / 2,如果中点索引arr[mid]不大于目标k,则
// left更新到mid的下一位索引mid+1,如此循环,直到left到达第一个大于
// k的元素的索引。
//
// 主函数GetNumberOfK则调用两次binarysearch,第一次调用binarysearch(array, k)
// 找k之后第一个大于k的元素(第一次调用找到k重复集的length索引)。
// 第二次调用binarysearch(array, k - 1)找k-1之后第一个大于k-1的元素(就是k),
// (第二次调用找到k重复集的0索引),两个返回值相减,就是k的出现次数(k
// 重复集的长度)

// 运行时间:11ms,超过84.49%用Java提交的代码
// 占用内存:9608KB,超过5.82%用Java提交的代码
public class Solution {
    public int GetNumberOfK(int[] array , int k) {
       return binarysearch(array, k) - binarysearch(array, k - 1);
    }
	
	public int binarysearch(int[] arr, int k) {
		int left = 0;
		int right = arr.length - 1;
		while (left <= right) {
			int mid = (left + right) / 2;
			if (arr[mid] <= k) {
				left = mid + 1;
			}
			else {  // k < arr[mid]
				right = mid - 1;
			}
		}
		return left;
	}
}





// 力扣
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:41.3 MB, 在所有 Java 提交中击败了70.38%的用户
class Solution {
    public int search(int[] nums, int target) {
        return binarysearch(nums, target) - binarysearch(nums ,target - 1);
    }

    public int binarysearch(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (arr[mid] <= target)
                left = mid + 1;
            else  // target < arr[mid] 
                right = mid - 1;
        }
        return left;
    }
}

Guess you like

Origin blog.csdn.net/fisherish/article/details/114730100