首页 > 其他分享 >【LeetCode】704. 二分查找

【LeetCode】704. 二分查找

时间:2024-01-21 16:35:53浏览次数:28  
标签:二分 right target nums 704 mid int LeetCode left

题目:704. 二分查找


解题思路

  • 思路:给定一个 nums 数组,注意数组是升序排列的;那么,找到当前 target 元素是否存在于数组之中,可采用二分法查找
  • 注意:此处定义该数组区间定义:【左闭右闭】/【左闭右开】
  • 使用left指向数组头,right 指针指向数组尾, mid 用于计算二分查找的位置,mid=left+(right-left)/2,避免由于 left 和 right 过大导致计算结果溢出的现象
  • 如果当前 nums[mid] 比 target 大,那么就往左边找;反之,则向右边找;如果相等,说明找到了,返回当前的 mid 值即可
  • 结束条件,当前的 left 移动到了 right 的右边,则说明两指针之间已不存在元素,则返回-1即可

C++代码实现

int search(int* nums, int numsSize, int target){
    int left=0,right=numsSize-1; //左右指针,分别指向数组头和尾
    // 左指针在右指针左边,或指向同一位置时进行循环
    while(left <= right){
        int mid = (left+right+1)/2;
        if(nums[mid] < target){
            left = mid + 1;
        }else if(nums[mid] > target){
            right = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;  //未查询到返回-1
}

Java代码实现

解法一:假设该区间为【左闭右闭】

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;

        while(left <= right) {
            int mid = left + (right-left)/2;
            if(nums[mid] > target) {
                right = mid - 1;
            } else if(nums[mid] < target) {
                left = mid + 1;
            } else {
                return mid;
            }
        }

        return -1;
    }
}

解法二:假设该区间为【左闭右开】

class Solution {
    public int search(int[] nums, int target) {
        //定义数组元素为左闭右开的区间,即不包括右边元素
        int left = 0, right = nums.length;
        while(left<right) {
            int mid = left + (right-left)/2;
            // System.out.printf("%d", mid);
            if(nums[mid] < target) {
                left = mid + 1;
            } else if(nums[mid] > target) {
                // 此时,因为该区间是左闭右开区间,不包括右元素,则将right值设置为mid
                right = mid;
            } else {
                return mid;
            }
        }
        return -1;
    }
}

参考资料:704. 二分查找

标签:二分,right,target,nums,704,mid,int,LeetCode,left
From: https://www.cnblogs.com/syr463/p/17977974

相关文章

  • 【LeetCode】27. 移除元素
    题目:27.移除元素解题思路给定一个数组,以及一个需要删除的值;要求在O(1)的空间复杂度中完成可考虑采用快慢指针的方式,left用于记录当前需要进行替换的元素,right指针用于遍历整个数组当right指针所指的值是待删除元素时,那么right右移,left不动即可若不是,那么将right......
  • Leetcode 066 加一
    https://leetcode.cn/problems/plus-one/description/给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位,数组中每个元素只存储单个数字。你可以假设除了整数0之外,这个整数不会以零开头。示例1:输入:digits=[1,2,3]输出......
  • 最少交换次数 置换环 LeetCode 2471. 逐层排序二叉树所需的最少操作数目
    voidMain(){ varroot=newTreeNode(1) { left=newTreeNode(3) { left=newTreeNode(7), right=newTreeNode(6) }, right=newTreeNode(2) { left=newTreeNode(5), right=newTreeNode(4) } }; varr=newSolution().Minimu......
  • leetcode 169(摩尔投票)
    Problem:169.多数元素目录思路解题方法复杂度Code思路这里选择采用摩尔投票的方式进行计算众数,这里众数的定义是超过一半的数,假设众数的票为+1,负数的票为-1,则不难得到:当目前的票数为0时,后面的众数仍然是整个数组的众数.根据这个性质设计算法所有数的票面值和为......
  • leetcode 80
    题目描述删除有序数组中的重复项II给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整......
  • BZOJ1717 Milk Patterns 产奶的模式 (二分+后缀数组+height数组)
    发现这样起标题更能引流(ylg实锤了)题意给定一个长度为\(n\)的数组\(a\),求在\(a\)中出现了至少\(k\)次的最长子串的长度。解法考虑将一个子串拆成两个后缀,即\([l,r]=[l,n]-[r,n]\),发现一个长度为\(x\)的子串\(t\)在\(i,j\)两个位置出现过当且仅当后缀\(i,j\)有......
  • Leetcode 26 删除数组重复项
    题目描述给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数......
  • datawhale-leetcode打卡:001-012题
    这次这十二个题目属于是极限肝出来的,有两个参考了一下题解,还是很有意思。我会按照我个人的感觉去写这个东西。螺旋矩阵(leetcode054)这个题目比较恶心的就是跑圈的过程怎么描述。首先,顺时针一圈下来是先从左到右,顶到最右边i<m,好再往下,顶到最下边i<n,好现在i--往回排,最后j--走完一......
  • LeetCode 第 121 场双周赛
    LeetCode第121场双周赛大于等于顺序前缀和的最小缺失整数代码:classSolution{public:intmissingInteger(vector<int>&nums){intn=nums.size();set<int>s;for(autox:nums){s.insert(x);}......
  • leetcode 17.电话号码的字母组合
    leetcode17.电话号码的字母组合第十七题:电话号码的字母组合1.回溯:首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。每次取电话......