小馬的力扣日記Day2 數(shù)組 #27 移除元素 #977 有序數(shù)組的平方

#27 移除元素


思路

由于它實(shí)際調(diào)用接口的例子是圖上這樣感耙,輸出的限制就比較多喘沿。要求原地刪除val制跟,不能開新的數(shù)組來存進(jìn)行刪除操作后的數(shù)組,那么每次檢測(cè)到val就把它后面的所有數(shù)前移一位颗搂。

遍歷數(shù)組,每次檢測(cè)到val就將之后的數(shù)前推一位幕垦,然后計(jì)數(shù)count加1丢氢。

nums.lenth-count=輸出的數(shù)組長(zhǎng)度lenth傅联。

Case 1:沒有相鄰且等于val的數(shù),那么正常運(yùn)行

Case 2:最后一位數(shù)等于val,隨著不斷地進(jìn)行這種粗糙的前移操作疚察,會(huì)從最后一個(gè)數(shù)copy出很多個(gè)等于val的值蒸走。解決辦法就是每次前移完成后將最后一位數(shù)覆蓋為101(因?yàn)関al是小于100的,不可能取到101).

Case 3:存在兩個(gè)以上相鄰且等于val的數(shù)貌嫡,這種時(shí)候由于將后一個(gè)數(shù)前移到當(dāng)前操作的num[i]比驻,導(dǎo)致會(huì)漏掉這個(gè)相連且重復(fù)的數(shù),解決辦法就是每次前移之后檢查num[i]岛抄,如果還等于val别惦,就從num[i]開始再執(zhí)行一次前移操作(套娃)


代碼

class Solution {

public:

? ? int removeElement(vector<int>& nums, int val) {

? ? ? ? int length,count=0;

? ? ? ? for (int i = 0; i < nums.size(); i++) {

? ? ? ? repeat:? if (nums[i]==val)

? ? ? ? ? {

? ? ? ? ? ? ? count++;

? ? ? ? ? ? ? for (int j=i; j<(nums.size()-1); j++)

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? nums[j]=nums[j+1];

? ? ? ? ? ? ? }

? ? ? ? ? ? ? //case 1:the last number is val

? ? ? ? ? ? ? if (nums[nums.size()-1]==val)

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? nums[nums.size()-1]=101;

? ? ? ? ? ? ? }

? ? ? ? ? ? ? //case 2:more than 2 near numbers are all equal to val then do the delete operation again

? ? ? ? ? ? ? //Actually I do not like "goto" ,it's dangerous ,but it's the first solution I thought out to deal with this

? ? ? ? ? ? ? //Pardon me....

? ? ? ? ? ? ? if (nums[i]==val)

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? goto repeat;

? ? ? ? ? ? ? }

? ? ? ? ? }

? ? ? ? }

? ? ? ? length=nums.size()-count;

? ? ? ? return length;

? ? }

};

反思


1.這種前移操作是非常粗糙的,會(huì)導(dǎo)致一些BUG夫椭,有優(yōu)化的空間掸掸。在測(cè)試中我也遇到了尾數(shù)是val和有多個(gè)相連的val數(shù)的情況。由于我采用的是遍歷式的for循環(huán)益楼,針對(duì)這兩種情況就只能見招拆招打補(bǔ)丁猾漫,而不能從結(jié)構(gòu)設(shè)計(jì)上優(yōu)雅地去避免這兩種情況出錯(cuò),有點(diǎn)尷尬感凤。

2.針對(duì)多個(gè)等于val的數(shù)相連的情況悯周,我采用的是每次前移之后都再次檢查當(dāng)前操作數(shù),如果也為val陪竿,則再次執(zhí)行前移禽翼,相當(dāng)于是個(gè)套娃操作。為了減少代碼量(圖省事)族跛,雖然不情愿闰挡,我還是采用了"goto"語句,用起來倒是沒什么問題礁哄。原諒我长酗,goto真的很危險(xiǎn)。桐绒。夺脾。。茉继。咧叭。。



#977 有序數(shù)組的平方


思路

看到這個(gè)題之后的直接想法就是直接全部平方存到新數(shù)組里(\omicron (n)操作)烁竭,然后再做一個(gè)排序菲茬,隨便什么排序都能滿足最基本的要求。

再看進(jìn)階要求,時(shí)間復(fù)雜度\omicron (n)婉弹,平方操作是固定的睬魂,那么只能從這個(gè)排序方法上做文章。普通的排序復(fù)雜度在\omicron (n^2 )镀赌,好一點(diǎn)的也要\omicron (n\lg n)汉买,達(dá)不到要求。但是注意到本題是一個(gè)非降序數(shù)列佩脊,即使有正有負(fù)蛙粘,那也有一個(gè)分界數(shù),這讓我聯(lián)想到了歸并排序里的Merge操作威彰,所以我決定采用這種方法出牧。

首先遍歷找到分界數(shù),然后從分界數(shù)的位置分割成兩個(gè)數(shù)組歇盼。

然后將兩個(gè)數(shù)組分別平方舔痕,一個(gè)從前往后,一個(gè)從后往前豹缀,兩個(gè)數(shù)組元素比較大小伯复,按順序歸并入新的數(shù)組。



代碼

class Solution {

public:

? ? vector<int> sortedSquares(vector<int>& nums) {

? ? ? ? int divide=0;

? ? ? ? int leftcount=0;

? ? ? ? int rightcount=0;

? ? ? ? int leftindex=0;

? ? ? ? int rightindex=0;

? ? ? ? int count=0;

? ? ? ? int i,j=0;

? ? //To find the index of the divide number

? ? ? ? for ( i=1 ; i<nums.size() ; i++ )

? ? ? ? {

? ? ? ? ? ? if ((nums[i]*nums[i-1])<=0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? divide=i-1;

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? // all 0

? ? ? ? if ((divide==0)&&(nums[nums.size()-1]<0))

? ? ? ? {

? ? ? ? ? ? divide=nums.size()-1;

? ? ? ? }

? ? // divide into two arrays


? ? ? ? int left[nums.size()];? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? int right[nums.size()];


? ? //initial left and right array

? ? ? ? for ( i=0 ; i< divide;i++)

? ? ? ? {

? ? ? ? ? ? left[i]=0;

? ? ? ? }

? ? ? ? for ( i=0 ; i< nums.size()-divide-1;i++)

? ? ? ? {

? ? ? ? ? ? right[i]=0;

? ? ? ? }

? ? ? ? for ( j=divide; j>=0 ; j--)

? ? ? ? {


? ? ? ? ? ? left[leftindex]=nums[j]*nums[j];

? ? ? ? ? ? leftindex++;

? ? ? ? }

? ? ? ? ? for ( i=divide+1 ; i<nums.size() ; i++)

? ? ? ? {


? ? ? ? ? ? right[rightindex]=nums[i]*nums[i];

? ? ? ? ? ? rightindex++;

? ? ? ? }

//Compare and merge

? ? ? ? for ( i=0; i<nums.size() ; i++)

? ? ? ? {

? ? ? ? ? if (rightcount<rightindex)

? ? ? ? ? {

? ? ? ? ? ? ? if (leftcount<leftindex)

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? if (left[leftcount]<=right[rightcount])

? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? nums[i]=left[leftcount];

? ? ? ? ? ? ? ? ? ? ? leftcount++;

? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? nums[i]=right[rightcount];

? ? ? ? ? ? ? ? ? ? ? ? rightcount++;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? nums[i]=right[rightcount];

? ? ? ? ? ? ? ? ? ? rightcount++;

? ? ? ? ? ? ? ? }

? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? nums[i]=left[leftcount];

? ? ? ? ? ? ? ? leftcount++;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? cout<<count<<' '<<leftcount<<' '<<rightcount;

? ? ? ? return nums;

? ? }

};


反思


這個(gè)歸并操作實(shí)現(xiàn)起來居然很艱難邢笙,主要是左右兩個(gè)數(shù)組的邊界情況把我繞暈了啸如。

內(nèi)存消耗沒辦法,如果是用最簡(jiǎn)單的平方加排序來做空間復(fù)雜度肯定會(huì)低很多氮惯。

不過我這個(gè)就屬于空間換時(shí)間了叮雳。

總的來說花了快兩個(gè)小時(shí),寫出來的代碼比較爛妇汗,感覺歸并的判斷邏輯可以優(yōu)化帘不,數(shù)組的大小可以優(yōu)化。杨箭。寞焙。

眼睛看花了,就這樣吧先

先吃個(gè)海鮮燜面互婿,拜拜

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捣郊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子擒悬,更是在濱河造成了極大的恐慌模她,老刑警劉巖稻艰,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懂牧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)僧凤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門畜侦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躯保,你說我怎么就攤上這事旋膳。” “怎么了途事?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵验懊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我尸变,道長(zhǎng)义图,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任召烂,我火速辦了婚禮碱工,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奏夫。我一直安慰自己怕篷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布酗昼。 她就那樣靜靜地躺著廊谓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麻削。 梳的紋絲不亂的頭發(fā)上蹂析,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音碟婆,去河邊找鬼电抚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛竖共,可吹牛的內(nèi)容都是我干的蝙叛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼公给,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼借帘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淌铐,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肺然,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腿准,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體际起,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拾碌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了街望。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片校翔。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灾前,靈堂內(nèi)的尸體忽然破棺而出防症,到底是詐尸還是另有隱情,我是刑警寧澤哎甲,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布蔫敲,位于F島的核電站,受9級(jí)特大地震影響炭玫,放射性物質(zhì)發(fā)生泄漏燕偶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一础嫡、第九天 我趴在偏房一處隱蔽的房頂上張望指么。 院中可真熱鬧,春花似錦榴鼎、人聲如沸伯诬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盗似。三九已至,卻和暖如春平项,著一層夾襖步出監(jiān)牢的瞬間赫舒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工闽瓢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留接癌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓扣讼,卻偏偏與公主長(zhǎng)得像缺猛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椭符,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容