球球速刷LC 排序

2021-10-07 08:21:08 字數 3876 閱讀 4777

最大數字

將字串排序,兩兩比較,二者組成的數字越大,則對於字串在前面。

bool

cmp(

const string& a ,

const string& b)

class

solution

if(result[0]

=='0'

) result =

"0";

return result;}}

;

以下兩題思路類似。

合併區間

插入區間

引用指數

理解h-index的概念。並排序後利用二分查詢找到第乙個滿足條件的值。

class

solution

int target=0;

int l=

0,r=num.

size()

;while

(lelse

}return num.

size()

-l;}

};

快排是典型的減而治之策略。快排的難點在「分」這個步驟。即將整個陣列劃分為<=pivot 和》pivot

兩大塊,並返回pivot的位置。在分的過程中,注意邊界問題。

參考以下文章學習快排的細節處理。

快排的寫法

使用快排解決以下問題:

題目:排序陣列

歸併排序的策略是分而治之,及將待排序序列一分為二,各自排序後再合併。它與快速排序的區別是,快排是先劃分為左右兩邊,右邊一定》=左邊,再各自排序。因此最後無需合併。而歸併排序再劃分時只是簡單的劃分為兩堆,不存在大小關係,所以最後還有合併環節。

經常使用 優先順序佇列來實現合併環節。

排序鍊錶

listnode*

mergetwolist

(listnode*h1,listnode*h2)

; priority_queue,vector>

,decltype

(cmp)

>

q(cmp);if

(p1) q.

push

(p1);if

(p2) q.

push

(p2)

;while

(!q.

empty()

)return node.next;

}

listnode*

sortonelist

(listnode*head)

}//split to two list

auto pfirst = head;

auto psecond = head;

while

(pfirst && pfirst-

>next && pfirst-

>next-

>next)

//only two nodes;

auto temp = psecond;

psecond = psecond-

>next;

temp-

>next =

null

;auto h1=

sortonelist

(psecond)

;auto h2 =

sortonelist

(head)

;return

mergetwolist

(h1,h2);}

listnode*

sortlist

(listnode* head)

歸併環節的應用。

合併k列表

歸併排序的乙個特點

歸併排序在完成「」這個環節後,序列被分為各自有序的左半邊集合,和右半邊集合。而且所有l集合元素,在原陣列中的位置是在r集合的左邊。也即是l、r元素之間的相對左右位置尚沒有發生改變。利用這個性質,可以結合二分查詢求陣列中每個元素ai的逆序數個數。(即j>i 且 aj求逆序數

class

solution

else

}return l-left_border;

}

vector<

int>res;

void

mergesort

(int lo,

int hi ,vectorint,

int>>

&nums)

//此時cmp的引數必須為const,養成const &cmp的好習慣!!!

auto cmp=

(const pair<

int,

int>

&a,const pair<

int,

int>

&b)-

>

bool

;inplace_merge

(nums.

begin()

+lo,nums.

begin()

+mid_sort+

1,nums.

begin()

+hi+

1,cmp);}

public

: vector<

int>

countsmaller

(vector<

int>

& nums);if

(nums.

size()

==1)return

;

vectorint,

int>>pairs;

for(

int i=

0;isize()

;++i)

res.

resize

(nums.

size()

,0);

mergesort(0

,nums.

size()

-1,pairs)

;return res;}}

;

該題還有乙個簡答解法就是利用插入排序,則乙個元素的逆序數就是其插入排序時的位置。

class

solution1

;

vector<

int>

ret(nums.

size()

,0);

for(

int i=nums.

size()

-1;i>=0;

--i)

else

else

}

sortednums.

insert

(sortednums.

begin()

+l,nums[i]);

ret[i]

=l;}

}return ret;}}

;

桶排序是基於非比較的排序演算法,其實質是用空間換時間。其效率為o(n);

基本原理:

**桶排序

非比較排序–桶排序

桶排序的乙個工程應用案例

桶排序應用

桶排序應用題目:

題目:最大gap

本題解析在 非比較排序–桶排序

總結:桶排序是典型的利用空間換時間,但是需要已知資料的特性,例如資料應均勻分布在一定範圍內。此時利用桶排序可以提高時間效率。

即使用優先順序佇列(二叉堆)來實現排序

題目:資料流的中位數

將元素依次插入已經排序好的序列

題目:插入排序排序鍊錶

**略排序的穩定性

球球速刷LC 貪心

貪心的思路很簡單 在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解,也就是當前最貪婪的解。跳躍遊戲1 維護乙個當前所能到達的視窗,並在這個視窗內遍歷每個點,看能達到的最遠距離farest。從而將視窗更新到當前視窗 end 1...

球球速刷LC之雙指標 二輪

無序兩數之和 對於當前num i 要找的是target num i 可利用集合逐漸構建搜尋集合 class solution table nums i i return ret 有序數字兩數之和 採用雙指標 class solution return ret else if curr else if...

球球速刷LC BFS DFS 二輪

二叉樹裡已經大量使用了dfs,bfs,二叉樹的前序遍歷,中序遍歷 後序遍歷就是dfs,層序遍歷 就是bfs。對於二叉樹這種具有單向分層結構,進行dfs bfs時無需擔心會重複訪問,但是對於無向圖或者 有向有環圖等結構,需要使用輔助資料結構來記錄當前節點是否已經訪問過。島嶼數目 class solut...