zoukankan      html  css  js  c++  java
  • [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;
        }
    }
    
  • 相关阅读:
    c# 导出text 文本文件
    c# 检查目录,当指定目录不存在时建立目录
    c# 控制台应用程序批量修改文件夹下的后缀名(包括子文件夹)
    oracleHelper 操作帮助类
    Sqlite操作帮助类
    oracle 备份数据库,导出数据库
    nehibernet .net注意事项
    一般处理程序多图片上传(可以更多)
    一般处理程序多图片上传(3个文件)
    我的Python分析成长之路4
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12364667.html
Copyright © 2011-2022 走看看