宁夏网站设计联系电话免费网站报价单怎么做
news/
2025/10/6 15:53:20/
文章来源:
宁夏网站设计联系电话,免费网站报价单怎么做,施工员证报名入口官网,站群网站程序力扣每日刷题 一、704. 二分查找1.1、题目1.2、解题思路1.3、代码实现——C1.4、 总结易错 二、27. 移除元素2.1#xff1a;题目2.2、解题思路2.3、代码实现——C1.4、 总结易错 一、704. 二分查找
1.1、题目
704. 二分查找
1.2、解题思路 题型#xff1a;数组… 力扣每日刷题 一、704. 二分查找1.1、题目1.2、解题思路1.3、代码实现——C1.4、 总结易错 二、27. 移除元素2.1题目2.2、解题思路2.3、代码实现——C1.4、 总结易错 一、704. 二分查找
1.1、题目
704. 二分查找
1.2、解题思路 题型数组、二分查找变式—寻找第1个大于等于目标值的元素 关键二分查找的关键点就是—两边夹高数上又叫作夹逼准则。left和right确定答案所在区间通过mid(把区间划分为[left,mid][mid1,right]两个区间)来缩小区间范围直到leftright,即获得答案。 为什么呢存在如下定理A target B当A B时target A B 思路 1.确定答案可能取值区间[left, right] 2.left 0;right nums.size()-1;(因为此题中array.length也有可能为答案 3.while(leftright)不考虑所谓的什么闭区间就仅仅代表它本身的含义当leftright时即找到答案跳出循环 为什么呢因为很多问题就这么设计一定要等到最后才能确定问题的答案在很多时候不能在循环体中找到答案。 4.确定循环体中分支的两种情况 a.targetarray[mid]leftmid1b.else (即targetarray[mid])rightmid 5.leftright跳出循环体后return array[right] targerright : -1; 为什么呢直接return left/right呢我们来分析一下跳出循环后的两种情况 情况1最简单的一种情况即夹逼准则成立时找到答案array[left]array[right]targer这个很好理解。此时array[left]targert情况2即没找到与target相等的元素的下标。因为array[left]targetarray[right]是默认恒成立的–即target应该存在于这个区间。即left指针指向[left,right]最后一个小于等于target的元素right指针指向[left,right]第一个大于等于target的元素。在[left,right]实际区间范围不断缩小的过程中当left和right重合时right指向的是[0,array.length-1]这个区间第一个大于等于target的元素.我个人目前觉得在理解层面上return right比return left要好理解一些虽然两者达到的效果是一样的
1.3、代码实现——C class Solution {public:int search(vectorint nums, int target) {int left 0;int right nums.size()-1;int mid 0;while(left right){int mid left ((right - left) 1);if(target nums[mid]) right mid;else left mid 1;}return nums[right] target ? right : -1;}};1.4、 总结易错
【易错】二分查找的重点就划分区间、逐渐缩小、两边夹关于划分区间这题第二个代码我用的划分为[left,mid]和[mid1,right]为什么不是**[left,mid-1]和[mid,right]**呢—因为会容易出现死循环 使用[left, mid-1]和[mid, right]划分区间的代码
class Solution {
public:int search(vectorint nums, int target) {int left 0;int right nums.size()-1;int mid 0;while(left right){int mid left ((right - left 1) 1);if(target nums[mid]) left mid;else right mid - 1;}return nums[right] target ? right : -1;}
};【重点】二分法的关键是缩小区间死循环发生的原因是某次循环没有缩小区间导致二分失败。 【重点】此题right设置为array.length的原因是array.length也有可能是问题答案 【重点】将二分查找的判断条件写成while(leftright)代表的是搜索区间为[left,right]一旦leftright,即此时找到问题答案立即跳出循环。 【重点】循环不变量在[left,right]搜索答案 【重点】防止溢出int mid left ((right - left) 1)/int mid left ((right - left 1) 1)
二、27. 移除元素
2.1题目 2.2、解题思路
这题我的想法是运用双指针
左指针负责从左往右遍历若遇到等于val的元素停下 此时右指针从右往左遍历若遇到非val元素将其赋值给左指针处。 左指针负责保证新数组为非val元素右指针保证能将右侧的非val元素填充到左指针当前检测到的val元素处当左右指针相等说明左指针包括左指针往左即为新数组。
2.3、代码实现——C
class Solution {
public:int removeElement(vectorint nums, int val) {int left 0;int right nums.size() - 1;while ( left right){if (nums[left] val){while(nums[right] val right left){right --;}if(nums[right] ! val){//右指针找到一个非val值并赋值给left指针所在位置nums [left] nums[right];right --;}else{break;}}left ;}return left; //因为返回的是长度所以1}
};1.4、 总结易错
【易错】这题的易错点在于在右指针向左探测寻找非val元素时它不一定找得到当找不到时说明此时左指针以左已经完全没有val元素左指针和右指针之间也没有非val元素此时就直接可以break跳出循环结束了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929474.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!