寒假刷題打卡第二天 雙指標 排序

2021-10-18 18:52:23 字數 3701 閱讀 5417

判斷是否是環形鍊錶

class

solution

else

return

false;}

return

true;}

};

最長子序列

給定乙個字串和乙個字串字典,找到字典裡面最長的字串,該字串可以通過刪除給定字串的某些字元來得到。如果答案不止乙個,返回長度最長且字典順序最小的字串。如果答案不存在,則返回空字串。

class

solution

else}if

(i2==j2)

else

if(j2==max_length)

//第n次把條件判斷中的==寫成=}}

return target;}}

;

找到倒數第 k 小的元素。

快速排序和堆排序都可以用於找到倒數第k小的元素。找倒數第k小的元素要用大頂堆。當堆中節點數量大於k時,如果此時新插入的元素小於堆頂元素,則刪除堆頂元素,從新插入當前元素。插入和刪除堆頂元素的時間複雜度都是logn。

事實上,快拍和堆排還能用於topk問題。對於快排,當找到kth元素時,遍歷整個陣列,則能得到topk。堆排中保留的k個元素就是topk。(顯然堆排的陣列中不能有重複的元素。)

快排:

class

solution

else

}inline

intpartition

(vector<

int>

& a,

int l,

int r)

a[l]

=x;return l;

}int

findkthlargest

(vector<

int>

& nums,

int k)

};

時間複雜度為o(n),空間複雜度o(logn).

最小堆(找最大topk,用最小堆)

class

solution

if(r < heapsize && a[r]

> a[largest])if

(largest != i)

}void

buildmaxheap

(vector<

int>

& a,

int heapsize)

}int

findkthlargest

(vector<

int>

& nums,

int k)

return nums[0]

;}};

[c++]資料結構:最大堆maxheap的建立與使用

出現頻率最多的 k 個元素

4.1 基於堆的實現

一開始的想法是建立hash table,然後把value作為堆的元素。找到最大的k個頻率。然後再去遍歷hash table,找出對應的key。實際上可以直接把pair作為堆的元素。

c++中堆有現成的實現,即priority_queue優先佇列。

c++優先佇列(priority_queue)用法詳解

class

solution

vector<

int>

topkfrequent

(vector<

int>

& nums,

int k)

// pair 的第乙個元素代表陣列的值,第二個元素代表了該值出現的次數

priority_queueint,

int>

, vectorint,

int>>

,decltype

(&cmp)

>

q(cmp)

;for

(auto

&[num, count]

: occurrences)

}else

} vector<

int> ret;

while

(!q.

empty()

)return ret;}}

;

4.2 基於快排的實現(bug版,測試未通過)

bug沒有找到。。。

class

solution

v[start]

=flag;

if(k==start-old_start || k==start-old_start-1)

return

;else

if(k < start - old_start -1)

qsort

(v, old_start, start -

1, k)

;else

qsort

(v, start +

1, old_end, k -

(start -old_start +1)

);} vector<

int>

topkfrequent

(vector<

int>

& nums,

int k)

vectorint,

int>> values;

//這個地方一定要用個vector來接收map,

//因為map無法根據i來索引

for(

auto

& kv: occurrences)

//注意上面這種寫法和下面這種寫法的區別

//for(int i=0;i// v.push_back(pair(s[i], m[s[i]]));

vector<

int> ret;

qsort

(values,

0, values.

size()

-1, k)

;for

(int i =

0; i < k; i++

)return ret;}}

;

按照字元出現次數對字串排序

5.1 快排版

class

solution

cout<<

"i:"

"j:"

= flag;

quicksort

(v, oi, i-1)

;quicksort

(v, i+

1, oj);}

string frequencysort

(string s)

}return ans;}}

;

5.2 堆排

class

solution

string frequencysort

(string s)

string ans = s;

int i=0;

while

(!q.

empty()

) q.

pop();

}return ans;}}

;

第5題是乙個全排序問題,顯然會比找topk 和 kth問題要簡單。但是都是可以用堆排和快排來做的。

第二天的任務第四天才完成,怎麼這麼菜的!!

打卡第二天

一大早就背了單詞不過這次有點不耐煩,沒有記完,而且花費時間有點多,下午去圖書館還了書,又借了幾本書,晚上和雪冰一塊做了鍛鍊大約30分鐘,又去接了逗逗,做了兩套綜合,看了下物理,發現公式都忘了,得著重看看了。晚上看了h5頁面,準備做乙個,等朋友過生日可以送乙個感覺挺好的。還是有點浮躁吧,馬上就要開學了...

打卡第二天

第一天的學習讓我受益匪淺,對於第二天的學習我充滿信心。今天主要講述了迴圈體的內容 1 while迴圈,條件為真的時候重複執行乙個 塊,當需要為乙個集合的每乙個元素執行乙個 塊的時候就需要for迴圈了。能使用for迴圈,就盡量不使用while迴圈。while 條件 else語句 迴圈體else 條件不...

leetcode第二天刷題

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空 看到這個題目第乙個想法就是用直接合併兩個陣列然後取中位數的方法。要注意的就是幾個陣列為空的情況需...