欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

数组刷题总结:二分法

时间:2023-07-05

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; }}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。