leetcode双指针——141/344/881

一、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;


}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值