一、141环形链表
1.题目
https://leetcode-cn.com/problems/linked-list-cycle/
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
2.思路
快慢指针,快指针走两格,慢指针走一个,两者相等作为判断条件
注:循环体内的判断条件应为fast和fast的下个节点是否为空,不然可能会出现越界错误
3.代码
public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null|| head.next == null) return false;
ListNode fast = head.next;
ListNode low = head;
while(low!=fast){
if (fast == null || fast.next == null) return false;
low = low.next;
fast = fast.next.next;
}
return true;
}
}
二、344 反转字符串
1.题目
https://leetcode-cn.com/problems/reverse-string/
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
2.思路
双指针一头一尾,互换位置
3.代码
class Solution {
public void reverseString(char[] s) {
if (s.length <=1) return ;
int left= 0;
int right = s.length -1;
while(left < right ){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left ++;
right --;
}
}
}
三、881救生艇
1.题目
https://leetcode-cn.com/problems/boats-to-save-people/
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
2.思路
要使需要的船数尽可能地少,应当使载两人的船尽可能地多。
先对 people 排序,然后用两个指针分别指向体重最轻和体重最重的人
设 people 的长度为 nn。考虑体重最轻的人:
若他不能与体重最重的人同乘一艘船,那么体重最重的人无法与任何人同乘一艘船,此时应单独分配一艘船给体重最重的人。从 \textit{people}people 中去掉体重最重的人后,我们缩小了问题的规模,变成求解剩余 n-1n−1 个人所需的最小船数,将其加一即为原问题的答案。
若他能与体重最重的人同乘一艘船,那么他能与其余任何人同乘一艘船,为了尽可能地利用船的承载重量,选择与体重最重的人同乘一艘船是最优的。从 \textit{people}people 中去掉体重最轻和体重最重的人后,我们缩小了问题的规模,变成求解剩余 n-2n−2 个人所需的最小船数,将其加一即为原问题的答案。
3.代码
class Solution {
public int numRescueBoats(int[] people, int limit) {
//if (limit)
Arrays.sort(people);
int left = 0;
int right = people.length-1;
int count =0;
while(left <= right){
if (people[left]+people[right]<=limit){
left++;
right--;
count++;
}else{
right--;
count++;
}
}
return count;
}
}