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

顺序表算法题(LeetCode)

1 移除元素

在这里插入图片描述
代码示例:

int removeElement(int* nums, int numsSize, int val) {int left = 0;for( int right = 0;right<numsSize;right++){if(nums[right]!=val){nums[left++]=nums[right];}}return left;
}

代码详细说明:
我们定义了两个变量leftrightleft作为标定位表示在它前面的元素都不为valright则作为判断位一直向后面找不为val的元素

建立一个for循环让right一直走到数组最后一个位置

 for( int right = 0;right<numsSize;right++);

如果right指向的数组元素不等于val则让right指向数组元素赋值给left指向的下标,如果等于val则不做任何处理

 if(nums[right]!=val){nums[left++]=nums[right];}}

最后left则为不等于val的数组元素数,将其返回

 return left;

小结:本题采用两个指针(不是C语言的指针,表示指向数组位置的意思)leftrightright指针负责遍历,而left指针确定要修改的位置,如果遇到数组元素一直不为val,则两者一起移动,如果遇到valleft停下来,直到right指针找到不为val的值将其赋值给left指针位置。

2 删除有序数组中的重复项

在这里插入图片描述
代码示例:

int removeDuplicates(int* nums, int numsSize) {int left ,right;left = 0;right = left+1;while(right<numsSize){if(nums[left]!=nums[right]){left++;nums[left]=nums[right]; }right++;}return left+1;
}

代码详细说明:
本题数组是一个非严格递增函数(即前面元素<=后面元素),面对这个数组删除重复项,依旧是采用两个指针leftrightleft指针由于锁定位置要改变的位置,而right则向后遍历找不等于left指向的元素与其交换。
首先,让left指向第一个元素下标,right指向left后面的一个位置,right=left+1

left = 0;
right = left+1;

right指针直到最后一个数组元素后面时则循环结束

while(right<numsSize)

在循环体中如果left指针指向内容与right相同时则只right指针移动,只有当left指向数组元素大小与rightleft指针才会向后一位并将right指向内存赋值给left指针指向区域。

 if(nums[left]!=nums[right]){left++;nums[left]=nums[right]; }right++;}

在这里插入图片描述
由于left是数组下标,所以返回实际元素个数时需要+1

return left+1;

最后说明:题目对数组元素大小限制非空,所以不存在数组元素大小为0的情况。

3 合并两个有序数组

在这里插入图片描述
代码示例:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int s1_right = m+n-1;int s1_left =  m-1;int s2_right = n-1;while(s1_left>=0&&s2_right>=0){if(nums2[s2_right]>=nums1[s1_left]){nums1[s1_right]=nums2[s2_right];s2_right--;}else{nums1[s1_right]=nums1[s1_left];s1_left--;}s1_right--;}//当有剩余的数组时while(s2_right>=0){nums1[s1_right]=nums2[s2_right];s1_right--;s2_right--; }
}

代码总体思路:由于两个数组元素都是非递减序列,并且我们最后也要保证改变后的nums1也是非递减序列,所以我们可以从nums1的最后一个位置开始赋值元素,即从后往前改变nums1数组,这样的设计也不会改变nums1的前面元素。我们取出从后往前取出nums1nums2的元素并比较大小将大的往nums1后面放。直到一个数组的元素全部放完,如果放完的是nums1则直接将剩下的nums2元素依次赋值到nums1前面就行了,如果是nums2放完则不用改变什么。

代码详细讲解:
创建三个指针分别指向
在这里插入图片描述

    int s1_right = m+n-1;int s1_left =  m-1;int s2_right = n-1;

当其中一个数组元素被遍历完之后则跳出循环

while(s1_left>=0&&s2_right>=0)

在循环体里面nums1nums2后面元素比较大小,并将较大值赋值给nums1[s1_right],并更新指针指向。

if(nums2[s2_right]>=nums1[s1_left]){nums1[s1_right]=nums2[s2_right];s2_right--;}else{nums1[s1_right]=nums1[s1_left];s1_left--;}s1_right--;

当其中一个数组遍历完成时,如果是nums1被遍历完则直接将nums2剩余元素全部放到nums1数组中

    while(s2_right>=0){nums1[s1_right]=nums2[s2_right];s1_right--;s2_right--; }

由于题目设计nums1的数组大小是正好装的下两个数组全部元素的,所以在添加nums2元素到nums1中是不会覆盖和改变nums1元素的,除非当前位置nums1元素已经被拿到s1_right指针处赋值过了。

http://www.dtcms.com/a/495138.html

相关文章:

  • Leetcode每日一练--37
  • F029 vue游戏推荐大数据可视化系统vue+flask+mysql|steam游戏平台可视化
  • leetCode第33题
  • 永久免费搭建网站网页设计与网站建设选择题
  • 【Spring AI】MCP Server 从 sse 升级到 streamableHttp
  • 如何基于Deepseek进行文本章节结构恢复
  • 颠覆传统测试范式:Keploy 如何用 eBPF 技术让测试“偷懒“却更高效?
  • 设计网站推荐html代码全媒体广告策划与营销
  • 企业服务网站开发简要说明网站制作的基本步骤
  • 伊萨推出升级版SUPRAREX™ PRO自动化切割设备:更大尺寸、更强结构、更高安全性、更易维护
  • 如何在本地部署大语言模型(Windows,Mac,Linux)三系统教程
  • 营销型网站建设营销型套网站模板软件
  • 【昆明市不动产登记中心-注册安全分析报告】
  • 2008iis添加网站打不开深圳前50强网站建设公司
  • graph neural architecture search
  • HTTP方法GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE,RESTful API设计的核心详解
  • 用CMake 实现U8g2 的 SDL2 模拟环境
  • 企业网站排名提升软件智能优化wordpress 创业
  • 企业网站建设调查问卷网站开发周记30篇
  • 网站模板网站免费建商城网站
  • 安徽感智教育科技有限公司成功加入安徽省物流协会
  • Chart.js 雷达图
  • 百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代
  • 微算法科技(MLGO)突破性AI推理控制:一种基于集成学习优化算法的无线传感设备边缘协同推理控制技术
  • 智存跃迁,阿里云存储面向 AI 升级全栈数据存储能力
  • 临淄专业网站优化哪家好g3云推广官网
  • python离线包安装方法总结
  • Docker网络和存储卷
  • REFRAG技术详解:如何通过压缩让RAG处理速度提升30倍
  • C++ stack、queue栈和队列的使用——附加算法题