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

网站不接入备案职业技能培训网站

网站不接入备案,职业技能培训网站,wordpress怎么添加友情链接,wordpress文章字号一、数组基础知识 在C中,数组在逻辑和物理空间中均是线性连续的,其元素下标从0开始。常见数组的操作: 双指针 (快慢指针)覆盖(删除数组元素)交换数组元素(用于排序等) …

一、数组基础知识

在C++中,数组在逻辑和物理空间中均是线性连续的,其元素下标从0开始。常见数组的操作:

  • 双指针 (快慢指针)
  • 覆盖(删除数组元素)
  • 交换数组元素(用于排序等)

当然如果用容器的话,像删除和排序可以直接用一些方法来实现

二、二分查找

leetcode 704题

核心思想是不断与中间元素比较,确定是左边的区间还是右边的区间,需要注意的是这里用到的双指针是左闭右闭,即[left,right],搞清楚这一点就比较容易了。具体代码参考如下:

class Solution {
public:int search(vector<int>& nums, int target) {int l=0,r=nums.size()-1;while(l<=r){int mid = (l+r)/2;if(target == nums[mid]) return mid;else if(target < nums[mid]) r = mid-1 ;else l=mid+1;}return -1;}
};

这里还需要理解的是循环结束后left和right的位置,若没有找到元素,left=right+1,从而跳出循环,返回-1。此时left左边的数表示的是比target要小的数(不包括left指向的数本身),而right右边表示比target大的数(不包括right指向的数)。有些题目会利用这一点出题,比如:

leetcode 35 搜索插入位置

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0,right = nums.size()-1;while(left <= right){int mid = (left+right) / 2;if(nums[mid] == target) return mid;else if(nums[mid] > target) right = mid - 1;else left = mid+1;}return left;}
};

要找的插入位置其实就是比target大的第一个元素的位置,也就是left。

下面再看一道题是利用两次二分查找确定相同元素的最大最小位置

leetcode 34题 

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int left = 0;int right = nums.size()-1;int first = -1;int last = -1;while(left<=right){int mid = (left+right) / 2;if(nums[mid] == target){first = mid;right = mid - 1; //从左边中继续找相等的元素,直到是最左边为止}else if(nums[mid] > target) right = mid - 1;else left = mid + 1;}left = 0;right = nums.size() - 1;while(left <= right){int mid = (left+mid) / 2;if(nums[mid] == target){last = mid;left = mid+1; //在mid右边继续找有没有相等的元素,直到最右边为止}else if(nums[mid] > target) right = mid - 1;else left = mid + 1;}return vector<int>{first,last};}
};

第一个注释确保了即使找到目标值,也会继续向左搜索,以确保找到第一个出现的索引。
第二个注释确保了即使找到目标值,也会继续向右搜索,以确保找到最后一个出现的索引。

三、移除元素

leetcode 27 移除元素

这道题的本质就是要删除掉指定的元素,一种方法是直接覆盖(暴力),参考代码如下:
 

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

另一种方法是快慢指针,可以直接在原数组上实现覆盖。其中,

快指针:用于遍历旧的数组,来找到符合条件的元素

慢指针:指向新数组下标

参考代码如下:

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

四、有序数组的平方

leetcode 977 有序数组的平方

这道题也是运用了双指针,因为新数组的最大值只可能出现在旧数组的首位,因此我们创建一个新数组,用k指向新数组最后,之后遍历旧数组,看看那边是最大值,就放入新数组中。参考代码如下:

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int k = nums.size()-1; //用于指向新数组的指针vector<int> result(nums.size(),0);for(int i=0,j=nums.size()-1;i<=j;){if(nums[i]*nums[i] < nums[j]*nums[j]){result[k] = nums[j]*nums[j];j--;k--;}else{result[k] = nums[i]*nums[i];i++;k--;}}return result;}
};

总结一下今天刷的题目,通常数组在有时间复杂度要求或滑动窗口的情况下,要考虑用双指针。

http://www.dtcms.com/wzjs/180476.html

相关文章:

  • 科讯cms怎么做网站地图曼联vs恩波利比分
  • 外贸网站制作价格表黄页88网官网
  • 广州微网站建设怎么样免费海报模板网站
  • 茶文化网站建设内容建立网站费用大概需要多少钱
  • 微网站免费模板14个seo小技巧
  • 了解做房产广告的网站武汉软件测试培训机构排名
  • 优秀材料写作网站搜索引擎技术优化
  • 重庆黔江做防溺水的网站网络营销与直播电商专升本
  • 新手搭建论坛己做网站百度广告优化师
  • 网站建设项目说明书模板优化大师tv版
  • 临沂网站建设教程关键词快速优化排名软件
  • 装个宽带多少钱西昌seo快速排名
  • 网推平台有哪些比较好seo网站优化培训怎么样
  • 门户网站建设请示app优化网站
  • 怎样在外贸网站做业务独立站平台选哪个好
  • 开发者选项开启好还是关闭好太原seo公司
  • 济南做网站的好公司2021热门网络营销案例
  • 做网站需要域名还需要什么网络赚钱推广
  • 网站收录不增加世界十大网站排名
  • 做网站优化选阿里巴巴还是百度链接买卖
  • 百度做网站多bt磁力王
  • wordpress 产品列表页东莞快速优化排名
  • 教人做素食的网站最近一个月的热点事件
  • 发布网站需要备案南京怎样优化关键词排名
  • pcb设计seo优化靠谱吗
  • 合肥做网站可以吗google官方入口
  • 中山做百度网站的公司吗免费服务器
  • 北京最新消息疫情搜索引擎优化指的是
  • 文成网站建设推广网站多少钱
  • 洛阳做网站哪家便宜营销工具