2024年C C++最新【C++】算法集锦(6,2024年最新附相关架构及资料

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

一次循环之后,重复上述动作,对划分出的部分再次循环,直到每个部分都只有一个元素为止。

#include

#include

using namespace std;

void doubleSideSort(vector &vec1,int left,int right) //序列与左右指针传入

{

//结束语

if (right == left)

return;

//基准确定

int flag = vec1[left];

int keep_right = right;

int keep_left = left;

int change_temp;

//当左右指针还没重合

while (left<right)

{

//左指针先走

while (left<right && vec1[left]<=flag)

{

left++;

}//当遇到比基准大的数,停下来

//轮到右指针走

while (left < right && vec1[right] >= flag) //可以都等,反正最后都会归并

{

right–;

}//当遇到比基准小的数,停下来

if (left < right)

{

change_temp = vec1[left];

vec1[left] = vec1[right];

vec1[right] = change_temp;

}

//然后继续循环

}

//left–;

//接着将基准放进去,此时必定是左右相合,则左值若大于左值左边一位,和左值左边一位换,若小,则和左值换

if (vec1[left] > vec1[left - 1])

{

vec1[keep_left] = vec1[left-1];

vec1[left-1] = flag;

}

else

{

vec1[keep_left] = vec1[left];

vec1[left] = flag;

}

doubleSideSort(vec1,0,left-1);

doubleSideSort(vec1, right, keep_right);

}

int main()

{

vector vec1 = { 4,6,8,7,9,3,1}; //测试用2个数测试最直观,因为最后都要通过这一步才能正常

int left = 0;

int right = vec1.size() - 1;

doubleSideSort(vec1, left, right);

for (; left <= right; left++)

cout << vec1[left] << " ";

cout << endl;

return 0;

}


链表成环


判断链表是否有环

就像那电影里的情节,男主女主在小树林里迷路了,到处都是树,他们兜兜转转,又回到了原点。

链表一旦成环,没有外力的介入是绕不出来的。

我举个栗子:

//ListNode* reverseList(ListNode* head)

//{

// ListNode* node_temp;

// ListNode* new_head;

//

// node_temp = head;

// //遍历一个节点,就把它拿下来放到头去

// while (head->next != NULL)

// {

// //先考虑只又两个节点的情况

// head = head->next;

// new_head = head;

// new_head->next = node_temp;

// node_temp = new_head;

// }

// return new_head;

//}

我也不知道当时是哪儿来的灵感,写出了这么个玩意儿。后来怎么着了?后来卡死了呗,就搁那儿绕圈,绕不出来了。

那要这么去判断一个链表是否有环呢?

其实说简单也简单,快慢指针就解决了,快指针两步走,慢指针一步走,只要两个指针重合了,那就说明有环,因为快指针绕回来了。

时间复杂度为线性,空间复杂度为常数。

说不简单也不简单,因为你去判断一个链表是否有环,那顶多是在测试环节,放在发布环节未免显得太刻意,连代码是否安全都不能保证。

而且,有环的话一般是运行不过的,不用测,运行超时妥妥要考虑一下环的情况,一调试就知道了。

寻找链表入环点

这个就比较需要脑子了,前边那个有手就行的。

我这个人,懒了点,来张现成的图吧。

在这里插入图片描述

看啊,在相遇之前呢,慢指针走的距离很好求的:L1 = D+S1;

快指针走的距离:设它在相遇前绕了n圈(n>1),那么:L2 = D+S1+n(S1+S2);

不过,还有一个等量关系,不要忽略掉,快指针的速度是慢指针的两倍,所以:L2 = 2L1;

那么就是:n(S1+S2)-S1 = D;

再转换一下就是:(n-1)(S1+S2)+S2 = D;

那也就是说,在相遇时候,把一个慢指针放在链表头,开始遍历,把一个慢指针放在相遇点开始转圈,当它俩相遇的时候,就是入环点了。

其实吧,用脑子想一开始很难想出来,用手想就快多了。

环的大小就不用我多说了吧,相遇之后,定住快指针,慢指针再绕一圈,再相遇的时候就是一圈了。


合并K个有序链表(困难)


合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:

[

1->4->5,

1->3->4,

2->6

]

img
img

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

[

1->4->5,

1->3->4,

2->6

]

[外链图片转存中…(img-CGNkUP6d-1715556237570)]
[外链图片转存中…(img-CEaiPaZ4-1715556237570)]

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值