首页 > 编程语言 >代码随想录算法训练营Day0| LeetCode704: 二分查找

代码随想录算法训练营Day0| LeetCode704: 二分查找

时间:2024-07-30 22:54:04浏览次数:10  
标签:right return target nums LeetCode704 随想录 Day0 middle left

LeetCode 704 二分查找

先看了一下数组理论基础:数组基础
题目链接:704.二分查找

啥也没看,凭感觉直接上手:

class Solution(object):
	def search(self, nums, target):
		for num in nums:
			if num == target:
				return nums.index(num)
				break
		return -1

通过倒是通过了,但是,我写的什么东西?二分在哪里呢?

然后去看算法公开课了:
代码随想录:手把手带你撕出正确的二分法

看完重新写:

class Solution(object):
	def search(self, nums, target):
		left = 0
		right = len(nums) - 1
		# target 在左闭右闭区间内
		while left <= right:
			middle = (left + right) / 2
			if nums[middle] < target:
				left = middle + 1
			elif nums[middle] > target:
				right = middle - 1
			else:
				return middle
		return -1
'''
刚开始写的时候,因为题中说n在[1, 10000], 
直接right = 10000了,然后报错list index out of range,
自己找到bug咯~ 撒花!

再看了一下力扣官方题解,可改进的地方:
1.开头对left, right的赋值可以精简到一行:
left, right = 0, len(nums) - 1
2.求middle时使用整数除法:
middle = (left + right) // 2
'''

补充左闭右开写法:

# 补充左闭右开写法:
class Solution(object):
	def search(self, nums, target):
		left = 0
		right = len(nums) - 1
		# target 在左闭右开区间内
		while left < right:  # 区分点1:确保区间合法
			middle = (left + right) // 2
			if nums[middle] < target:
				left = middle + 1
			elif nums[middle] > target:
				right = middle
				# 区分点2:避免重复比较nums[middle]点
			else:
				return middle
		return -1

代码随想录的讲解:文章讲解

整理:

使用二分法的前提条件:
1.数组为有序(升序)数组;
2.数组中无重复元素
二分法注意事项:
1.想清楚区间的定义(不变量),保证区间合法;
2.if条件语句中避免重复比较

学习+做题+整理用时:2h
30/07/2024

标签:right,return,target,nums,LeetCode704,随想录,Day0,middle,left
From: https://blog.csdn.net/Christina_6111/article/details/140806775

相关文章

  • 代码随想录二刷(链表章节)
    代码随想录二刷(链表章节)链表就是通过指针串联在一起的线性结构,每个节点都是由一个数据域和指针域(存放下一个节点的指针)。双链表就是每个节点中既有指向前一个节点的,也有指向后一个节点的。循环链表就是把头和尾连起来。性能分析如下:下面来看下链表的具体题目:Leetcod......
  • 代码随想录day14 || 226 翻转二叉树,101 对称二叉树, 104 二叉树的最大深度, 111 二叉树
    226翻转二叉树funcinvertTree(root*TreeNode)*TreeNode{ //思考,广度优先遍历,对于每一层,翻转其左右子节点 ifroot==nil{ returnnil } queue:=list.New() queue.PushBack(root) size:=1//存储每一层的节点个数 forqueue.Len()>0{ varcountint ......
  • 代码随想录算法训练营第28天 | 贪心进阶
    2024年7月30日题122.买卖股票的最佳时机II上涨就买,下跌就不买。classSolution{publicintmaxProfit(int[]prices){intsum=0;for(inti=1;i<prices.length;i++){sum+=prices[i]-prices[i-1]>0?prices[i]-prices[i-1]:0;......
  • 代码随想录算法训练营第27天 | 初入贪心
    2024年7月29日题455.分发饼干先排序,然后依次分发即可。classSolution{publicintfindContentChildren(int[]g,int[]s){//对于每个孩子胃口,从小到大分配,且给尽可能少的饼干Arrays.sort(g);Arrays.sort(s);intcnt=0;......
  • 代码随想录——完全平方数(Leetcode 279)
    题目链接动态规划动态规划思路:状态定义:定义一个一维数组dp,其中dp[i]表示组成整数i所需的最少完全平方数的数量。状态初始化:将dp数组中的所有元素初始化为Integer.MAX_VALUE,表示初始状态下组成每个整数的完全平方数数量是无限大(即不可能)。但dp[0]需要初始化为0,因为组成......
  • HarmonyOS APP应用开发项目- MCA助手(Day03持续更新中~)
    简言:gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注:此App参照此教程进行二次修改:https://www.bilibi......
  • 代码随想录 day39 零钱兑换 | 完全平方数 | 单词拆分
    零钱兑换零钱兑换解题思路还是完全背包的套路,但这次我们要求的是最小值,因此每次遍历的时候我们要找到最小值,每次给dp增加的大小不在是物品的价值而是长度,所以+1。知识点完全背包心得难点在于怎么样找到最小值完全平方数[完全平方数(https://programmercarl.com/0279.完......
  • C语言day06(数组、字符数组)
    C语言day06【1】数组1》概念:具有一定顺序的若干变量的集合2》定义格式:存储类型数据类型数组名[元素的个数]例:intarr[5];//定义了一个数组arr,在内存空间中开辟了5个空间来储值在数组中保存的每一条数据都叫(元素)变量数组名:代表数组的首地址(地址常量);数组......
  • Day09
    二进制0b八进制0十六进制0x最好避免使用浮点数进行比较float具有舍入误差接近但不等于所有的字符本质上还是数字强制转换的格式......
  • Java学习笔记day07
    多线程基本了解1.多线程_线程和进程进程:在内存中执行的应用程序线程:是进程中最小的执行单元线程作用:负责当前进程中程序的运行.一个进程中至少有一个线程,一个进程还可以有多个线程,这样的应用程序就称之为多线程程序简单理解:一个功能就需要一......