• [LeetCode]面试题53


    面试题53 - I. 在排序数组中查找数字 I

    题目

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

    输入: nums = [5,7,7,8,8,10], target = 8
    输出: 2
    示例 2:

    输入: nums = [5,7,7,8,8,10], target = 6
    输出: 0

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    两次二分,分别查找第一个等于target的索引,和最后一个等于target的索引。

    代码

    class Solution {
        public int search(int[] nums, int target) {
            int firstPos = searchFirst(nums, target);
            int lastPos = searchLast(nums, target);
            return firstPos == -1? 0 : lastPos - firstPos + 1;
        }
    
        private int searchFirst(int[] nums, int target){
            int l = 0;
            int r = nums.length - 1;
            while(l <= r){
                int mid = l + (r - l) / 2;
                if(nums[mid] == target){
                    r = mid - 1;
                }else if(nums[mid] > target){
                    r = mid - 1;
                }else{
                    l = mid + 1;
                }
            }
            return l != nums.length && nums[l] == target ? l : -1; 
        }
    
        private int searchLast(int[] nums, int target){
            int l = 0;
            int r = nums.length - 1;
            while(l <= r){
                int mid = l + (r - l) / 2;
                if(nums[mid] == target){
                    l = mid + 1;
                }else if(nums[mid] > target){
                    r = mid - 1;
                }else{
                    l = mid + 1;
                }
            }
            return r != -1 && nums[r] == target ? r : -1; 
        }
    }
    

    面试题53 - I. 面试题53 - II. 0~n-1中缺失的数字

    题目

    一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

    示例 1:

    输入: [0,1,3]
    输出: 2
    示例 2:

    输入: [0,1,2,3,4,5,6,7,9]
    输出: 8

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    二分。nums[idx]==idx,则答案在右侧,nums[idx]!=idx,则答案在左侧。

    相关

    条件反射:有序->二分
    二分思路:重点在于用什么条件判断选择左半边/右半边

    代码

    class Solution {
        public int missingNumber(int[] nums) {
            int l = 0;
            int r = nums.length - 1;
            while (l <= r) {
                int mid = l + (r - l) / 2;
                if (nums[mid] == mid) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            return l;
        }
    }
    
  • 相关阅读:
    典型分布式系统分析:MapReduce
    linux下如何查看自己都装了什么服务
    docker
    linux的命令操作
    IDEA去除掉虚线,波浪线,和下划线实线的方法
    在linux下安装配置rabbitMQ详细教程
    在linux下安装配置rabbitMQ详细教程
    Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
    shell之startup
    shell脚本特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12364667.html
Copyright © 2020-2023  润新知