【cpp算法详解】 数组原地删除 、删重复值、表整数加一

前言

今天继续学习小浩算法的数组操作,还是挺简单的,明天 有点想加大难度做一下链表,嘻嘻。做数组还是挺爽的,一方面本身算法就不难,另外vector也封装了很多方法,我们不用自己实现。
小浩算法教程

  • 数组原地删除
  • 数组删除重复值
  • 数组表达整数且加一

数组原地删除

思路

考研的时候,跟着b站的大师兄学数据结构算法每日一题,两个指针去遍历的这种思想已经深入我的骨髓了。所以这个原地删除我的方法是设置两个一前一后的指针。设置int类型的指针i和j,i的初始值为0,j的初值为1。我们还需要考虑以下的三种情况。

首先我们需要明白 i 的作用是找到需要删除的元素j的作用是找到不需要删除的元素。因此当我们的 i 找到了需要删除的元素之后,此时 j 也应该是不需要删除的第一个元素,把两者交换即可。这样最后列表的最后全都是要删除的元素,而前面则是需要保留的。

  • 如果 arr [i]不是待删除元素,则i 和 j 一起后移
  • 如果arr [i] 是待删除的元素,且arr[j] 不是待删除元素,则把arr[i]和arr[j]交换位置
  • 如果arr[i] 是待删除的元素,arr[j]也是,那么就一直j++,直到arr[j]不是。

最后循环的结束条件是j已经遍历到最后一个元素了。
其实大家如果看小浩给的代码,会发现它就用了一个cpp vector的erase方法就可以解决了,并不需要两个指针,相当于erase帮我们都封装好了。我们这道题的要求是:空间复杂度是O(1),我去专门查了一下,直接用erase把元素删掉,貌似底层的空间复杂度并不一定是为1的,这也是我在学习的时候遇到的疑问,如果有大佬能解答,欢迎评论。

我的代码

#include<iostream>
#include<vector>
#include <algorithm> //包含通用算法
using namespace std;

void del_in_place(vector<int>& arr,int del_num,int &del_num_count ) {
   
	int i = 0, j = 1,swap;
	for (i; j < arr.size() - 1; i++) {
   
		if (arr[i] == del_num && arr[j] != del_num) {
   
			swap = arr[i];
			arr[i] = arr[j];
			arr[j] = swap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值