}
// 快排
void quickSort(vector<vector>& arr, int l, int r) {
if(l >= r) return ;
int i = l, j = r, mid = arr[(l + r) >> 1][0];
do{
while(arr[i][0] < mid) i++;
while(arr[j][0] > mid) j–;
if(i <= j)
swap(arr[i++], arr[j–]);
}while(i <= j);
quickSort(arr, l, j);
quickSort(arr, i, r);
}
};
===========================================================================
题目:
给定两个数组,arr1 和 arr2,
- arr2 中的元素各不相同
- arr2 中的每个元素都出现在 arr1 中
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
示例:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
提示:
-
1 <= arr1.length, arr2.length <= 1000
-
0 <= arr1[i], arr2[i] <= 1000
-
arr2 中的元素 arr2[i] 各不相同
-
arr2 中的每个元素 arr2[i] 都出现在 arr1 中
思路:
将排序规则
arr2
加入map中,自定义sort排序,将规则改成
- 在map中存在的为小值
- 如果都在
map
中,则比较数组下标看谁小(map
值)
- 否则直接比较两个值
class Solution {
public:
vector relativeSortArray(vector& arr1, vector& arr2) {
unordered_map<int, int> map;
for(int i = 0; i < arr2.size(); i++)
map[arr2[i]] = i;
sort(arr1.begin(), arr1.end(), [&](int x, int y) {
if(map.count(x)) {
return map.count(y)? map[x] < map[y] : true;
}else {
return map.count(y)? false : x < y;
}
});
return arr1;
}
};
=================================================================================
题目:
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
提示:
-
1 <= k <= nums.length <= 104
-
-104 <= nums[i] <= 104
思路:
优先队列(大根堆)
第
K
大 等价于 第n = nums.size() - k + 1
小,所以我们存储最小的n
个元素,堆顶就是第k大元素
当堆达到
n + 1
时 将堆顶移除,这样就可以保持将 大于 第k
大的元素移除掉
class Solution {
public:
int findKthLargest(vector& nums, int k) {
// 第k大就是第nums.size() - k + 1 小;
// 小到大排序
priority_queue<int, vector, less> pq;
int n = nums.size() - k + 1;
for(int i : nums) {
pq.emplace(i);
if(pq.size() > n) pq.pop();
}
return pq.top();
}
};
=========================================================================
题目:
给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例:
输入:head = [4,2,1,3]
输出:[1,2,3,4]
提示:
-
链表中节点的数目在范围 [0, 5 * 104] 内
-
-105 <= Node.val <= 105
进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
思路:
归并思想:找中点 + 递归成单个链表节点 + 合并链表
找中点时记得将中点的前一个与后面断开
class Solution {
public:
// 找中点 + 递归成单个链表节点 + 合并链表
ListNode* sortList(ListNode* head) {
// 到只剩一个元素返回
if(head == nullptr || head->next == nullptr)
return head;
// 数组分成两段并返回中点
ListNode* head1 = head;
ListNode* head2 = serachMid(head);
head1 = sortList(head1);
head2 = sortList(head2);
// 合并并返回
return merge(head1,head2);
}
// 找中点
ListNode* serachMid(ListNode* head) {
ListNode *slow = head, *fast = head;
while(fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode* mid = slow->next;
slow->next = nullptr;
return mid;
}
// 合并链表
ListNode* merge(ListNode* head1, ListNode* head2) {
ListNode* dummy = new ListNode(-1);
ListNode* cur = dummy;
while(head1 && head2) {
if(head1->val <= head2->val) {
cur->next = head1;
head1 = head1->next;
}else {
cur->next = head2;
head2 = head2->next;
}
cur = cur->next;
}
if(head1) cur->next = head1;
if(head2) cur->next = head2;
return dummy->next;
}
};
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
小米商场项目实战,别再担心面试没有实战项目:
纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
[外链图片转存中…(img-B2UUoRG1-1711568961099)]
总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
[外链图片转存中…(img-KvMEHzFl-1711568961099)]
小米商场项目实战,别再担心面试没有实战项目:
[外链图片转存中…(img-gR54iRn6-1711568961100)]