<leedcode>
27.移除元素https://leetcode.cn/problems/remove-element/
题目条件:给定一个数组nums和一个val值,原地移除数组中等于val的元素
返回:nums中元素的数量
法一:暴力解法:使用两个for循环嵌套
外层for循环:遍历数组元素看是否有等于val的元素
内层for循环:如果数组中有等于val的元素,执行内层for循环,将后面的元素依次往前移
cpp
#include<stdio.h>
//移除元素函数
//参数:数组首地址,数组长度,要删除数组中的值
int removeElements(int* data, int len, int val)
{
//暴力解法:使用两个for循环解决
for (int i = 0; i < len; i++)
{
if (data[i] == val)
{
//使用for循环将所有元素整体前移一位覆盖数组i下标上的元素
//for (int j = i; j < len - 1; j++)//或者写成
for (int j = i + 1; j < len; j++)
{
//data[j] = data[j + 1];//或者写成
data[j - 1] = data[j];
}
i--;//因为i下标后移了一位
len--;//数组长度在改变
}
}
return len;
}
//实现
int main()
{
int data[] = { 2, 4, 5, 6, 6, 6, 6 };
int len = sizeof(data) / sizeof(data[0]);
int result = removeElements(data, len, 5);//数组元素个数:6
printf("数组元素个数:%d", result);
return 0;
}
时间复杂度:O(n**2)
空间复杂度:O(1)
法二:双指针法
初始时:slow,fast均指向0下标
思路:快指针fast通过for循环遍历数组,如果下标fast指向的数组元素不等于val,则将下标fast指向的元素赋值给下标slow指向的元素,同时下标slow++
cpp
#include<stdio.h>
//移除元素函数
//参数:数组首地址,数组长度,要删除数组中的值
int removeElements(int* data, int len, int val)
{
//双指针法
//起始时:慢指针slow指向下标为0的元素,快指针指向下标为0的元素
int slow = 0;
for (int fast = 0; fast < len; fast++)
{
if (data[fast] != val)//遍历下标对应元素不为val的值赋值给data[slow]
{
data[slow] = data[fast];
slow++;
}
}
return slow;
}
//实现
int main()
{
int data[] = { 2, 4, 5, 6, 5, 6, 6 };
int len = sizeof(data) / sizeof(data[0]);
int result = removeElements(data, len, 5);
printf("数组元素个数:%d", result);
return 0;
}
时间复杂度:O(n)
空间复杂度:O(1)