• 二分查找


    此博客链接:

    二分查找

    题目链接:https://leetcode-cn.com/problems/binary-search/

    题目

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。


    示例 1:

    输入: nums = [-1,0,3,5,9,12], target = 9
    输出: 4
    解释: 9 出现在 nums 中并且下标为 4
    示例 2:

    输入: nums = [-1,0,3,5,9,12], target = 2
    输出: -1
    解释: 2 不存在 nums 中因此返回 -1
     

    提示:

    你可以假设 nums 中的所有元素是不重复的。
    n 将在 [1, 10000]之间。
    nums 的每个元素都将在 [-9999, 9999]之间。

    题解

    此题时简单的二分查找,用一个指针只向头,一个指向尾,还有一个指针指向中间,每次把中间指针所指的元素和目标值比较,如果大于中间值,则在前半段数组中查找目标,如果小于目标值,则在后半段数组中查找目标元素,直到目标值和中间值相等时,就找到了目标值。

    代码

    class Solution {
        public int search(int[] nums, int target) {
            int left=0;
            int right=nums.length;
            int mid=(left+right)/2;
            int res=-1;
            if(target==nums[left])
            return 0;
            if(target==nums[right-1])
            {
                return right-1;
            }
            for(int i=left;i<right;i++){
                if(target<nums[mid]){
                    right=mid;
                    mid=(left+right)/2;
                }
                else if(target>nums[mid])
    {
         left=mid;
                    mid=(left+right)/2;
    }
    else
    {
    res=mid;
    break;
    }
    
            }
            return res;
        }
    }

    结果

     第一个错误版本

    题目链接:https://leetcode-cn.com/problems/first-bad-version/

    题目

    你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

    假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

    你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

     
    示例 1:

    输入:n = 5, bad = 4
    输出:4
    解释:
    调用 isBadVersion(3) -> false
    调用 isBadVersion(5) -> true
    调用 isBadVersion(4) -> true
    所以,4 是第一个错误的版本。
    示例 2:

    输入:n = 1, bad = 1
    输出:1

    题解

    我没有看懂案例,函数返回true代表是错误的版本,题目也给了错误版本,那不应该是向前查找那个版本是错误的,为什么还有输入5来检查正确性。

    看了好长时间,代码的输入只有一个,而题目给的案例有两个输入,这几个意思?

    如果输入是给的总次数,而函数调用返回的是

    代码

    结果

    插入搜索位置

    题目

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    你可以假设数组中无重复元素。

    示例 1:

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

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

    输入: [1,3,5,6], 7
    输出: 4
    示例 4:

    输入: [1,3,5,6], 0
    输出: 0

    题解

    代码

    class Solution {
        public int searchInsert(int[] nums, int target) {
            int len=nums.length;
            if(target<nums[0])
            return 0;
            if(target>nums[len-1])
            return len;
            int low=0;
            int high=len-1;
            int min=(low+high)/2;
            int res=0;
           while(low<high){
                min=(low+high)/2;
                if(nums[min]>target){
                    high=min;
                    
                }
                else if(nums[min]<target){
                    low=min+1;
                     
                }
                else{
                low=min;
                  break;
                }
            }
            return low;
        }
    }
    

      

    结果

    出来混总是要还的
  • 相关阅读:
    gcc编译常用选项
    汇编指令随笔
    VIM简单操作
    Linux编译阻塞型驱动遇到'TASK_NORMAL' undeclared (first use in this function)问题解决办法
    Linux中断流程分析
    Linux驱动开发之LED驱动
    函数(三)
    函数(二)
    文件和函数(一)
    文件处理和字符编码
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/15017698.html
Copyright © 2020-2023  润新知