前言
今天继续学习小浩算法的数组操作,还是挺简单的,明天 有点想加大难度做一下链表,嘻嘻。做数组还是挺爽的,一方面本身算法就不难,另外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