栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数组刷题总结:二分法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数组刷题总结:二分法

704:二分查找

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

方法一:

数组查找我暴力查找的,

错误点:for语句规则;return 返回值(在for中写了两个if判断)程序最后没有把不满足条件的值返回

方法二:二分法

思考:

做题之前:因为是有序数组,想直接通过for or while 写循环,写循环条件的时候,发现没法往左和右递归。

题解后,原来是看二分法的中间位置是不是想要查找的值 nums[mid]==target

二分法知识总结:

1.二分法使用的前提条件,数组是有序数组,且数组中无重复元素

2.二分法边界条件:每次递归的二分法的区间

while(left < right) or while(left <= right) right=middle or right = middle-1

区间定义的是不变量,每次循环的不变量

区间定义:左闭右闭[left,right],这里区间定义是什么意思呢?就是right有没有在区间中存在,看程序的最初right的定义

while(left <= right)  right = middle-1

二分法程序总结:

1.判断target是否在整个数组的范围内

2.定义其实左右边界left,right

3.while循环(mid决定left和right的值)

        中间值mid定义->判断左右区间的移动方向(不移动:mid就是要查找的值;左移动:right=mid-1;右移:left=mid+1)

4.没找到返回-1

刷题总结:

二刷:

思路没有问题了,在大脑中想象如何二分的动图;

出错点,mid=l+(r-l)<<1

左移符号是">>",没有把(r-l)>>1 叫括号,使得程序不知道要运行进行左移

        

方法一:暴力遍历

class Solution {
    public int search(int[] nums, int target) {
        for(int i= 0 ;i < nums.length;i++){
            if(nums[i]==target){
                return i;
            } 
        }
        return -1;
    }
}


方法二:二分法

class Solution{
    public int search(int[] nums,int target){
        if(target nums[nums.length-1]){
                return -1;

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

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/732307.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号