当前位置: 首页 > news >正文

室内装修设计网站推荐宁波seo托管公司

室内装修设计网站推荐,宁波seo托管公司,郑州哪个公司专业做网站,icp备案网站接入信息怎么填目录 数组基础知识补充 704. 二分查找 题目 左闭右闭方法 思路 代码 左闭右开方法 思路 代码 27. 移除元素 题目 暴力解法 思路 代码 双指针法 思路 代码 数组基础知识补充 1. 在leecode中,数组一般是以vector容器的形式出现的,虽然ve…

目录

数组基础知识补充

704. 二分查找

题目

左闭右闭方法

思路

代码

左闭右开方法

思路

代码

27. 移除元素

题目

暴力解法

思路

代码

双指针法

思路

代码


数组基础知识补充

1. 在leecode中,数组一般是以vector容器的形式出现的,虽然vector的底层实现是array,但严格来讲vector是容器,不是数组;

2. 数组元素的删除和增添都需要移动后续元素,而且在实现的角度上看,数组元素是不能删的,只能用后一个元素将其覆盖掉,然后再逐个覆盖,就相当于向前移动后续元素了;

3. C++二维数组的存储空间是连续的,但Java的不是,Java中每一个外层数组都会有指针指向内层数组的地址。

704. 二分查找

题目

左闭右闭方法

左闭右闭,意味着搜索区间是闭合的,比如 [ 1 , 5 ],在这种区间搜索元素,两个指针指向同一个元素时一定是有意义的,因为区间涉及到的元素都在区间内;

但如果搜索区间是半开半闭的,那么就要考虑指针不能指向开的那个元素,需要对代码进行一定的改动。

思路

用二分查找来做这道题是高效且简单的,因为元素递增不重复;

闭合区间二分的思路是,分别给数组的最左边和最右边一个指针,每次通过求两个指针指向地址的中间处那个元素的值,来判断是否和目标值相等,相等的话就返回中间处的值的下标,不相等的话则分为两种情况:

如果中间处的值小于目标值,以为这中间处以及它的左边的元素都太小,所以接下来我们就把搜索区间的左边界缩到中间处右边一个的元素那里;

如果中间处的值大于目标值,同理就把搜索区间的右边界缩小到中间处左边一个的元素那里。

因为这里是一个闭区间,所以二分的终止条件就是两个指针指向相同,这时候如果指向的元素不等于目标值,那就返回 -1 。

代码

class Solution {
public:int search(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1; int mid = 0;while (l <= r) {mid = l + (r - l) / 2; // 防止l和r过大,直接相加越界if (nums[mid] == target)return mid;if (nums[mid] < target)l = mid + 1;elser = mid - 1;}// 带入一个有两个元素的数组测试样例就知道,如果我们的目标是后者,第一次的mid指向前面那个,后面的l加一以后就指向目标了,这时候l和r相等,mid也和它们相等了,可以得到结论;//如果没有在while条件中写=,那么l和r指向相同时就直接跳出循环了,这时候mid还未赋新值,就会出错return -1;}
};

左闭右开方法

思路

大体上和上面的方法一样,主要注意的是while的终止条件,这时候就不能是指针指向相同了,要把等于号去掉,因为区间边界一开一闭,两者显然是不能混为一谈的;

另外,开区间的那一边的搜索边界需要注意,如果mid指向的元素大于目标值,那么这时候将有边界缩小到mid即可,不用减一,具体见代码。

代码

class Solution {
public:int search(vector<int>& nums, int target) {int l = 0, r = nums.size();while (l < r) {int mid = l + (r - l) / 2;if (nums[mid] < target)l = mid + 1;else if (nums[mid] > target)r = mid; // 这时候不能再写mid-1了,因为这是开区间,mid肯定不可能是目标值了,但是mid-1可能是,如果把mid-1赋值给r,那就意味着排除掉了mid-1elsereturn mid;}return -1;}
};

27. 移除元素

题目

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素。

暴力解法

思路

用内外两层指针,外层指针遍历数组并寻找和目标值相等的元素,找到以后使用内层指针遍历该元素之后的所有元素,将所有元素往前移动一位,其实就是用后一个元素将前一个元素覆盖掉;

其中有一些细节需要注意,首先是数组长度要实时记录,最后返回的就是数组长度,而且每次覆盖一轮后数组长度就减一了,所以外层指针相应地也要减一

代码

class Solution {
public:int removeElement(vector<int>& nums, int val) {int size = nums.size();for (int i = 0; i < size; i++) {if (nums[i] == val) {for (int j = i + 1; j < size; j++)nums[j - 1] = nums[j];i--;size--;} }return size;}
};

双指针法

思路

使用一快一慢两个指针,用一个for循环完成两个for循环的任务。

首先定义一个慢指针,在此基础上再定义一个快指针在数组里从头扫到尾,如果遇见不等于目标值的数,就把这个数赋值给慢指针,相当于用慢指针创造了一个不包含目标值的新数组,但是这个新数组使用的就是原数组的空间。

代码

class Solution {
public:int removeElement(vector<int>& nums, int val) {int slow = 0;for (int fast = 0; fast < nums.size(); fast++) {if (nums[fast] != val)nums[slow++] = nums[fast];}return slow; // 因为最后slow还有一个++,所以这里直接返回,不用+1}
};

http://www.rdtb.cn/news/2102.html

相关文章:

  • 一个工厂做网站有什么好处找客源免费用哪个软件好
  • 旅游网站设计方案国际最新十大新闻事件
  • 装门做特卖的网站厦门网站优化
  • 阿里云做企业网站成都市seo网站公司
  • 做网站优化常用工具seo发帖论坛
  • asp.net实用网站开发doc英雄联盟最新赛事
  • 合肥网站优化seo课堂
  • 自己搭建个人网站百度 官网
  • 政府网站建设新媒体指标百分百营销软件官网
  • 小程序设计开发西青seo
  • 襄阳网站建设培训网络推广
  • 静态网站建设的主要技术重庆seo网页优化
  • 贵阳网络网站建设吉林百度查关键词排名
  • 设计网站怎么做网络推广是啥
  • 网站怎么做移动图片不显示不出来英文关键词seo
  • 电子商务网站规划建设与管理超级软文
  • 设计企业网站步骤app注册接单平台
  • 营销型网站建设的特色电销系统软件排名
  • 专业网站建设推荐西安疫情最新数据消息中高风险地区
  • 民族服装的网站建设东莞网站建设推广平台
  • 国内精美网站欣赏重庆森林电影
  • 学生制作网页教程西安seo网站管理
  • 网站可信认证在哪里做全网营销方案
  • 确定网站推广目标黄页引流推广网站软件免费
  • 政府网站域名注册项目营销推广策划
  • 广州外贸网站建设 open六年级上册数学优化设计答案
  • 怎么建设自己淘宝网站首页郑州网络推广报价
  • 17网站一起做武汉推广系统
  • 简易logo图片大全太原关键词排名优化
  • 徐州做网站那家好百度站长中心