最大數字
將字串排序,兩兩比較,二者組成的數字越大,則對於字串在前面。
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...