进度:28/100
原题1:
给定两个数组 nums1
和 nums2
,返回 它们的 交集 。
输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
原题2:
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
原题3:
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i
,都有一个胃口值 g[i]
,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j
,都有一个尺寸 s[j]
。如果 s[j] >= g[i]
,我们可以将这个饼干 j
分配给孩子 i
,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。
原题4:
冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
在加热器的加热半径范围内的每个房屋都可以获得供暖。
现在,给出位于一条水平线上的房屋 houses
和供暖器 heaters
的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
注意:所有供暖器 heaters
都遵循你的半径标准,加热的半径也一样。
1.两个数组的交集--简单
思路:
(1.哈希。用数组存一下两个数组出现过的数的个数,如果有数在两个数组均存在,则放入vector中。
(2.双指针。先给两个数组排序,然后用两个指针分别指向数组前端,谁小谁移指针,相等就放入vector,并且把后面相等的数都去重。
这里我刚开始用的是while while if(=)然后在数据【1】,【3】那里溢出了,想了一下恍然大悟:第一个while会让指针指到数组外面,那么第二个while就没法与指针指的数比较,就会报错。改成
if(>) else if(<) else(=)就过了。
2.旋转链表--中等
虽然会写,但是难得是一气呵成想+写出来的,还是把思路捋捋。
思路:
把整个链表连成环,然后计数有多少个节点,k转化为k%n,易证第n-k个节点成为了新终点,记下n-k+1个节点为新起点,将n-k个节点指向nullptr。
错在判断特殊情况:当k=t-1时,不进入循环,但新终点为头节点,所以要单独拎出来讨论。
3.分发饼干--简单
思路:
发现双指针类题写while总是容易错,但是一个一个if,else的来就不会错。
4.供暖器--中等
思路:
(1.纯粹的双指针,自己想的。下午写了个代码wrong到倒数第二个数据,想不明白怎么回事出去玩了,深夜搁这改代码,灵机一动加了个等于号做判断条件就过了。不是哥们,为啥呀,没想明白。虽然理论上来讲,加个等号肯定没错。可是不加等号错哪了?是abs没用吗?还是什么鬼
abs(houses[i]-heaters[j])>=abs(houses[i]-heaters[j+1])
哦大师我悟了。评论区一句话:如果heaters数组有重复元素的情况下,指向heaters中元素的指针就会停留在有重复元素的地方,后面的元素就会被忽略了。
(2.二分加双指针。找离当前房屋最近的两个heater,一个在左边一个在右边。
标签:heaters,while,链表,算法,数组,节点,指针 From: https://blog.csdn.net/2301_79742457/article/details/144139538