LeetCode 剑指 Offer II 排序 专题总结(1),Java程序员必备书籍

}

// 快排

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);

}

};

075. 数组相对排序

===========================================================================

题目:

给定两个数组,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;

}

};

076. 数组中的第 k 大的数字

=================================================================================

题目:

给定整数数组 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();

}

};

077. 链表排序

=========================================================================

题目:

给定链表的头结点 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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
img

总结

如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了

《Java中高级核心知识全面解析》

小米商场项目实战,别再担心面试没有实战项目:

纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
[外链图片转存中…(img-B2UUoRG1-1711568961099)]

总结

如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了

《Java中高级核心知识全面解析》

[外链图片转存中…(img-KvMEHzFl-1711568961099)]

小米商场项目实战,别再担心面试没有实战项目:

[外链图片转存中…(img-gR54iRn6-1711568961100)]

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值