单链表快速排序
思路:
和普通快排一样,递归实现遍历。递归的每一层都遍历一遍当前的链表,将链表按照节点值分成三部分:等于枢轴值、小于枢轴值和大于枢轴值。递归排序后,将三段链表进行拼接。
时空复杂度:
平均时间复杂度为 O(nlogn),额外空间复杂度为 O(logn)。
代码:
1 | class Solution { |
和普通快排一样,递归实现遍历。递归的每一层都遍历一遍当前的链表,将链表按照节点值分成三部分:等于枢轴值、小于枢轴值和大于枢轴值。递归排序后,将三段链表进行拼接。
平均时间复杂度为 O(nlogn),额外空间复杂度为 O(logn)。
1 | class Solution { |
其实第一眼没有思路,瞄了一眼标签是“数学”,就开始推公式
假设容量为x升的水壶进行了a次操作,容量为y升的水壶进行了b次操作,最终两水壶中的水总共是z升。可以得到公式:
emm,好眼熟的公式,好像是斐蜀定理。。。
对于任意正整数a,b,那么一定存在非零整数x,y,使得
再扩展一下,对于这道题的方程
当且仅当时该二元不定方程才有整数解。因此这道题就可以解决了。
也就意味着当时应满足:,OK了。
1 | int gcd(int a, int b) |
好像还有BFS的解法,打算再看一下。
快速排序:
1
2
3
4
5
6
7
8
9
10
11
12 void quick_sort(int l, int r, vector<int>& arr)
{
if(l >= r) return;
int i = l - 1, j = r + 1, mid = arr[l + r >> 1];
while(i < j)
{
do i++; while(arr[i] < mid);
do j--; while(arr[j] > mid);
if(i < j) swap(arr[i], arr[j]);
}
quick_sort(l, j, arr), quick_sort(j + 1, r, arr);
}
归并排序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void merge_sort(int l, int r, vector<int>& arr, vector<int>& temp)
{
if(l >= r) return;
int mid = l + r >> 1, i = l, j = mid + 1, k = 0;
merge_sort(i, mid, arr, temp), merge_sort(j, r, arr, temp);
while(i <= mid && j <= r)
{
if(arr[i] <= arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
while(i <= mid) temp[k++] = arr[i++];
while(j <= r) temp[k++] = arr[j++];
for(int i = l, k = 0; i <= r; i++, k++)
arr[i] = temp[k];
}
然鹅。。。以上两种方法都太菜了😳
最终解决方法:
1 sort(arr.begin(), arr.end());
Over!😂
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment