2357. 使數(shù)組中所有元素都等于零

方法一:模擬
只要數(shù)組中還有大于0的非零數(shù),我們反復(fù)獲取其中大于零的最小正整數(shù),然后用數(shù)組中的每一個(gè)非零數(shù)減去最小正整數(shù);
Python版本
C++版本
復(fù)雜度分析
時(shí)間復(fù)雜度: O(C)。數(shù)組中有多少種數(shù),則會(huì)進(jìn)行多少次循環(huán),數(shù)值的值域的上限為100。
空間復(fù)雜度:O(1)。
方法二:貪心
將數(shù)組所有元素削減為零,等價(jià)于將數(shù)組中最大的元素削減為零;每一次操作刪除最小的非零數(shù),對(duì)于一個(gè)唯一的數(shù)來說,非零數(shù)立即被置為零,對(duì)于多個(gè)同值的數(shù)而言,將被同時(shí)減去最小非零數(shù)。因此問題就轉(zhuǎn)化為:求數(shù)組中非零數(shù)的種數(shù),此處的指的是是數(shù)值;
Python版本
C++版本
復(fù)雜度分析
時(shí)間復(fù)雜度:O(C)。最多重復(fù)100次。
空間復(fù)雜度:O(C)。集合去重,由題可知最多有100個(gè)不同的數(shù)字;
備注
使用while循環(huán)一定要注意入口條件和出口條件,在方法一中,我們本可以用
any() | all()
語(yǔ)句判斷是否數(shù)組中是否還存在非零數(shù),但不夠簡(jiǎn)潔,寫題速度不夠快。其次注意本題的操作對(duì)象,每次均對(duì)非零數(shù)減去最小非零整數(shù),若選取最小值再對(duì)所有數(shù)減去最小值,那么數(shù)組中每一個(gè)元素會(huì)無(wú)限減小,但永不為零,導(dǎo)致解題進(jìn)入TLE
的死循環(huán)。總之慎用 while 循環(huán),優(yōu)選 for 循環(huán)