C語(yǔ)言移除元素的三種思路講解
問題描述
原題鏈接:https://leetcode.cn/problems/remove-element/
解題方案
思路一
思路一:
首先通過簡(jiǎn)單分析,很明顯這是一道順序表相關(guān)問題。首先能夠想到的是暴力求解,即思路一:找到所有的val,每次挪動(dòng)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; }
但是對(duì)于思路一,空間復(fù)雜度顯然是O(1),當(dāng)我們計(jì)算時(shí)間復(fù)雜度的時(shí)候,最壞的情況是數(shù)組中大部分值都為val,這時(shí)時(shí)間復(fù)雜度近似為O(1+2+……+n-1)即O(n^2),顯然O(n^2)的時(shí)間復(fù)雜度還是不盡人意,本著降低時(shí)間復(fù)雜度,我們可以怎樣優(yōu)化呢?
思路二
思路二:
在創(chuàng)建一個(gè)臨時(shí)數(shù)組tmp,遍歷nums數(shù)組,把不是val的數(shù)值放到tmp數(shù)組,最后把tmp數(shù)組的內(nèi)容依次拷貝到nums數(shù)組,返回tmp數(shù)組長(zhǎng)度。
??代碼展示:
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ù)中使用了變長(zhǎng)數(shù)組 int tmp[numsSize];而變長(zhǎng)數(shù)組的大小不能為0,這是使用特殊處理,是因?yàn)榱鄣臏y(cè)試用例中含有[] 0
。
對(duì)于思路二,最壞的情況我們只遍歷了1遍數(shù)組,即時(shí)間復(fù)雜度為O(n),但是這明顯是一種用空間換區(qū)時(shí)間的方法,在此過程我們創(chuàng)建了numsSize個(gè)變量,即空間復(fù)雜度為O(n)。所以我們能不能通過再降低空間復(fù)雜度,進(jìn)一步優(yōu)化呢?
思路三(最優(yōu)解)
思路三:
創(chuàng)建兩個(gè)變量src、dest,初始時(shí)指向首部,判斷nums[src]是否等于val,如果等于val則dest指向不動(dòng),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; }
這種思路下時(shí)間復(fù)雜度為遍歷整個(gè)數(shù)組O(n),創(chuàng)建的變量為有限個(gè),所以空間復(fù)雜度為O(1)。相比之下為最優(yōu)解。
到此這篇關(guān)于C語(yǔ)言移除元素的三種思路講解的文章就介紹到這了,更多相關(guān)C語(yǔ)言移除元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
udp socket客戶端和udp服務(wù)端程序示例分享
這篇文章主要介紹了udp socket客戶端和udp服務(wù)端程序示例,需要的朋友可以參考下2014-03-03C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度
這篇文章主要介紹了C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度,算法在編寫成可執(zhí)行程序后,運(yùn)行時(shí)需要耗費(fèi)時(shí)間資源和空間(內(nèi)存)資源,更多相關(guān)需要的朋友可以參考一下2022-07-07C語(yǔ)言基礎(chǔ)應(yīng)用處理學(xué)生打分?計(jì)算時(shí)間?最少硬幣問題詳細(xì)過程
很多的問題其實(shí)可以用編程來(lái)解決作答,本篇文章帶你用C語(yǔ)言解決最少硬幣問題、計(jì)算已經(jīng)過去了多久、學(xué)生成績(jī)自動(dòng)打分來(lái)做基礎(chǔ)的訓(xùn)練2022-02-02C語(yǔ)言模擬實(shí)現(xiàn)字符串庫(kù)函數(shù)的示例講解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言模擬實(shí)現(xiàn)字符串庫(kù)函數(shù)的具體方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01C語(yǔ)言菜鳥基礎(chǔ)教程之單精度浮點(diǎn)數(shù)與雙精度浮點(diǎn)數(shù)
在C語(yǔ)言中,單精度浮點(diǎn)數(shù)(float)和雙精度浮點(diǎn)數(shù)(double)類型都是用來(lái)儲(chǔ)存實(shí)數(shù)的,雙精度是用記憶較多,有效數(shù)字較多,數(shù)值范圍較大。2017-10-10C語(yǔ)言實(shí)現(xiàn)24位彩色圖像二值化
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)24位彩色圖像二值化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10