C語言移除元素的三種思路講解
問題描述
原題鏈接:https://leetcode.cn/problems/remove-element/

解題方案
思路一
思路一:
首先通過簡單分析,很明顯這是一道順序表相關(guān)問題。首先能夠想到的是暴力求解,即思路一:找到所有的val,每次挪動val后的數(shù)據(jù)覆蓋刪除val。

??代碼展示:
int find(int*nums,int numsSize,int val)
{
int i=0;
for(i=0;i<numsSize;i++)
{
if(nums[i]==val)
return i;
}
return -1;
}
int removeElement(int* nums, int numsSize, int val)
{
int ret;
while((ret=find(nums,numsSize,val))!=-1)
{
for(int i=ret;i<numsSize-1;i++)
{
nums[i]=nums[i+1];
}
numsSize--;
}
return numsSize;
}
但是對于思路一,空間復(fù)雜度顯然是O(1),當(dāng)我們計算時間復(fù)雜度的時候,最壞的情況是數(shù)組中大部分值都為val,這時時間復(fù)雜度近似為O(1+2+……+n-1)即O(n^2),顯然O(n^2)的時間復(fù)雜度還是不盡人意,本著降低時間復(fù)雜度,我們可以怎樣優(yōu)化呢?
思路二
思路二:
在創(chuàng)建一個臨時數(shù)組tmp,遍歷nums數(shù)組,把不是val的數(shù)值放到tmp數(shù)組,最后把tmp數(shù)組的內(nèi)容依次拷貝到nums數(shù)組,返回tmp數(shù)組長度。

??代碼展示:
int removeElement(int* nums, int numsSize, int val)
{
if(numsSize==0)//特殊處理
return 0;
int i=0;
int tmp[numsSize];
int count=0;
for(i=0;i<numsSize;i++)
{
if(nums[i]!=val)
{
tmp[count]=nums[i];
count++;
}
}
for(i=0;i<numsSize;i++)
{
nums[i]=tmp[i];
}
return count;
}注釋:這里的特殊處理是因?yàn)樵诤瘮?shù)中使用了變長數(shù)組 int tmp[numsSize];而變長數(shù)組的大小不能為0,這是使用特殊處理,是因?yàn)榱鄣臏y試用例中含有[] 0。

對于思路二,最壞的情況我們只遍歷了1遍數(shù)組,即時間復(fù)雜度為O(n),但是這明顯是一種用空間換區(qū)時間的方法,在此過程我們創(chuàng)建了numsSize個變量,即空間復(fù)雜度為O(n)。所以我們能不能通過再降低空間復(fù)雜度,進(jìn)一步優(yōu)化呢?
思路三(最優(yōu)解)
思路三:
創(chuàng)建兩個變量src、dest,初始時指向首部,判斷nums[src]是否等于val,如果等于val則dest指向不動,src向后偏移,直到nums[src]!=val,令nums[dest]=nums[src],然后src、dest都向后偏移,直到src遍歷完數(shù)組,程序結(jié)束。

??代碼展示:
int removeElement(int* nums, int numsSize, int val)
{
int src=0;
int dest=0;
while(src<numsSize)
{
if(nums[src]!=val)
{
nums[dest]=nums[src];
src++;
dest++;
}
else
src++;
}
return dest;
}

這種思路下時間復(fù)雜度為遍歷整個數(shù)組O(n),創(chuàng)建的變量為有限個,所以空間復(fù)雜度為O(1)。相比之下為最優(yōu)解。
到此這篇關(guān)于C語言移除元素的三種思路講解的文章就介紹到這了,更多相關(guān)C語言移除元素內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)動態(tài)開辟存儲楊輝三角
這篇文章主要介紹了如何利用C語言實(shí)現(xiàn)動態(tài)開辟存儲楊輝三角,可以靈活的開辟空間,充分的利用空間。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2022-03-03
C語言中操作sqlserver數(shù)據(jù)庫案例教程
這篇文章主要介紹了C語言中操作sqlserver數(shù)據(jù)庫案例教程,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++連接mysql的方法(直接調(diào)用C-API)
首先安裝mysql,點(diǎn)完全安裝,才能在在安裝目錄include找到相應(yīng)的頭文件,注意,是完全安裝,需要的朋友可以參考下2017-06-06
解決了個困擾了2天的問題,定點(diǎn)運(yùn)算問題
本文主要講解定點(diǎn)運(yùn)算問題,需要的朋友可以參考一下。2016-06-06
C語言實(shí)現(xiàn)班級學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)班級學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11

