算法day08

第一题

1. 两数之和

         由上述题意所知,本题要采用二分法的解题思路,二分法主要是面向有序的数组且也满足二段性的数组,所谓二段性就是在一定的规则下能把该数组分成两个部分;

        本题注意要点:

1、循环结束的条件:

        左指针>右指针时,该循环结束;

2、关于中点的求解公式

        一般采用左指针+整个数组一半的方法,而不是左右指针之差+1的和除以2,主要是防治后者会发生溢出;

        综上所述,代码如下:

class Solution {public int search(int[] nums, int target) {int left = 0,right = nums.length-1;while(left <= right){//找到中间点,防止溢出int mid = left + (right-left)/2;if(nums[mid] < target){left = mid+1;}else if(nums[mid] > target){right = mid-1;}else{return mid;}}return -1;}
}

故此二分法的朴素解题模版如下所示:

第二题

        

         如上题所示,本题需要通过二分查找的方法来找到一个满足题意的连续数组,所以简单来说就需要查找原数组的左右端点;

        上题中的原数组由于是非递减,锁说明满足二段性,即可以使用二分法;

步骤一:就是来分析如何查找左端点:

细节一:

        关于循环条件的分析,两种循环条件如下所示:

        如上图分析,(1,2)左区域里面的数值永远小于t,(3,3,3,4,5)右区域里面的数可能大于等于t;

        所以当mid指针所指的数值x接下来右如下分析:

        x<t时,t值的位置在mid右边,所以更新左指针,left=mid+1,即得到一个新的循环区间;

        x>=t时,t值的位置在mid的左边或者mid的位置,所以right=mid;

        所以当我们的判断条件是left<=right时,做如下分析:

        如果原数组里有我们需要的结果,左后左指针会与右指针重逢,且指向我们所求的端点,但是由于我们的判断条件,所以就会一直更新区间;分析图如下所示:

        综上所述:

1、left=right的时候,就已经出现结果了,不需要在进行判断了;

2、如果在判断就会出现死循环;

细节二:

        关于在循环条件时,我们进行中点计算的公式选择分析:

        有下图所示,重点选择的公式有下面两种方式:

        上面两种方法的区别就是当有长度为2的数组是,找到的中点事不同的;

        第一种方法找到的中点是left,第二种方法找到的中点是right;

        接下来讲第一种中点方法:

        

        如上图所示,第一种中点选择时,

        x<t时,左指针右移和右指针相等,则得到要判断的值;

         x>=t时,左指针右移两位,左指针在右指针的右边,则当前没有找到需要的点,循环结束;

        接下来讲第二种中点方法:

        如上图所示,第二种中点选择时,

        x<t时,左指针右移两位,左指针在右指针的右边,则当前没有找到需要的点,循环结束;

         x>=t时,右指针不变,则进入死循环;

步骤二:就是来分析如何查找右端端点:

细节一:

        关于循环条件的分析,有上述左端点的分析,我们选择left<right;

细节二:

        如上分析,我们选择

        分析如下:

分析如上,代码如下:

        

class Solution {public int[] searchRange(int[] nums, int target) {int[] ret = new int[2];ret[0]= ret[1] = -1;if(nums.length == 0){return ret;}//1二分左端点int left = 0,right = nums.length-1;while(left < right){int mid = left +(right-left)/2;if(nums[mid] < target){left = mid+1;}else{right = mid;}}//此时做左右指针相遇,接下俩判断该相遇点的值是否为目标值if(nums[left] != target){return ret;}else{ret[0] = left;}//2、二分右端点left = 0;right = nums.length-1;while(left < right){int mid = left +(right-left+1)/2;if(nums[mid] <= target){left = mid;}else{right = mid-1;}}//此时做左右指针相遇,接下俩判断该相遇点的值是否为目标值if(nums[left] != target){return ret;}else{ret[1] = right;}return ret;}
}

解题经验如下:

ps:本次的内容就到这里了,如果大家感兴趣的话就请一键三连哦!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI助力,统信UOS服务器版V20(1070)打造智算底座新生态丨年度更新

随着人工智能&#xff08;AI&#xff09;技术的蓬勃发展&#xff0c;各行各业都迎来了前所未有的变革机遇。 在这一时代潮流下&#xff0c;统信软件凭借其深厚的技术积累和对行业趋势的敏锐洞察&#xff0c;于日前重磅推出了统信UOS服务器版V20&#xff08;1070&#xff09;。…

从Photoshop到AutoCAD,TeamOS在线预览全搞定:可道云TeamOS系统的在线预览功能深度体验

我们每天都要处理大量的文件&#xff0c;领导发过来的压缩包、同事发来的psd文件等&#xff0c;各种格式的文件杂乱又不好查阅…… 迫切需要一个能够在线预览、管理文件的平台。 初次搭建teamOS 可道云teamOS是一个企业级的在线文件管理平台&#xff0c;支持上百种格式的在线…

回收站删除的文件怎么恢复?6个恢复技巧记得收藏!

“回收站删除的文件还有机会恢复吗&#xff1f;应该怎么操作才能恢复回收站里删除的文件呀&#xff1f;本人纯小白&#xff0c;希望大家推荐几个简单易懂的恢复方法。” 在使用电脑的过程中&#xff0c;我们时常会不小心将重要文件误删到回收站&#xff0c;甚至直接从回收站中彻…

Python重复文件清理小工具

针对电脑长期使用产生的重复文件&#xff0c;尤其是微信电脑版每转发一次生成一个重复文件的问题&#xff0c;用python写了一个批量清理重复文件的小工具&#xff0c;记录备用。 import shutil import tkinter from tkinter import filedialog import os import threading imp…

数字水印 | 奇异值分解 SVD 的 Python 代码实现

&#x1f951;原理&#xff1a;数字水印 | 奇异值分解 SVD 的定义、原理及性质 &#x1f951;参考&#xff1a;Python 机器学习笔记&#xff1a;奇异值分解&#xff08;SVD&#xff09;算法 正文 对于一个图像矩阵&#xff0c;我们总可以将其分解为以下形式&#xff1a; 通过…

轻松掌握Python中的延时技巧:time模块的妙用

在编程中&#xff0c;我们经常需要让程序暂停一段时间&#xff0c;以便进行某些操作或等待某些事件发生。Python提供了多种方式来实现延时&#xff0c;其中最常用的是time模块。本文将详细讲解如何使用time模块来实现延时操作&#xff0c;并提供几个实用的示例代码。 基本原理…

【Maven】Nexus简单使用

1、安装配置介绍Nexus私服&#xff1a; 安装配置指路上一篇详细教程博客 【Maven】Nexus私服简介_下载安装_登录-CSDN博客 简单介绍原有仓库类型&#xff1a; proxy代理仓库&#xff1a;代理远程仓库&#xff0c;访问全球中央仓库或其他公共仓库&#xff0c;将资源存储在私…

MySQL单表查询案例演示

目录 一、创建数据库lianxi 二、选择数据库为lianxi 三、新建一个数据表grade&#xff0c;在grade表中插入数据 四、开始进行查询操作&#xff08;验证表中数据&#xff09; 1、查询1945班的成绩信息 2、查询1945班&#xff0c;语文成绩大于60小于90的成绩信息 3、查询学…

Elasticsearch - HTTP

文章目录 安装基本语法索引创建索引查看索引删除索引 文档创建文档更新文档匹配查询多条件查询聚合查询映射 安装 https://www.elastic.co/downloads/past-releases/elasticsearch-7-17-0 下载完成启动bin/elasticsearch服务&#xff0c;可以在Postman调试各种请求。 基本语法…

wamp 安装 PHP8

最近的项目需求&#xff0c;需要将PHP 升级8使用&#xff0c;一直都是用wamp &#xff0c;所以需要在wamp集成PHP8 1、首先下载 php8 的包。地址&#xff1a; PHP: Downloadshttps://www.php.net/downloads.php 下载版本是目前最新的 PHP8.3.7&#xff0c;不要下载nts 版本&a…

动态规划高频问题(算法村第十九关白银挑战)

最少硬币数 322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总…

各种姿势打穿企业内网

以前不是说要讲隧道吗&#xff1f;&#xff1f;&#xff1f; 鸽了这么久终于想起来了&#xff01;&#xff01;&#xff01; 1.本次实验环境拓扑 先来讲一下本次的实验环境吧&#xff0c;这样会更加清晰明了一点 首先我们是拿到了win7&#xff0c;然后最终目标上线内网的Wi…