LeetCode分类刷题----算法思想

本文介绍了LeetCode中利用双指针和二分查找算法解决的问题,包括环形链表、救生艇、反转字符串等。通过案例分析了双指针的多种应用,如快慢指针、滑动窗口等,并详细讲解了二分查找在有序数组和矩阵搜索中的应用。
摘要由CSDN通过智能技术生成

算法思想

双指针

2021.3.2 – 2021.3.6


141.881.344.27.167.633.345.680.88.524

双指针思想适用于①左右双指针:。
②快慢双指针:判断是否有环
③滑动窗口


141. 环形链表

问题

在这里插入图片描述
在这里插入图片描述

思路

①快慢双指针,有环两者就能相遇。

    public boolean hasCycle(ListNode head) {
   
        if(head == null || head.next==null){
   
            return false;
        }
        ListNode s = new ListNode(-1);
        ListNode f = new ListNode(-1);
        s = head;
        f = head;
        while(f !=null && f.next!=null){
   
            s = s.next;
            f = f.next.next;
            if(s == f){
   
                return true;
            }
        }
        return false;

        
    }

881. 救生艇

问题

在这里插入图片描述
在这里插入图片描述

思路

先排序,双指针,最大的和最小的相加,如果最重的人可以与最轻的人共用一艘船,那么就这样安排。否则,最重的人无法与任何人配对,那么他们将自己独自乘一艘船。

    public int numRescueBoats(int[] people, int limit) {
   
        //先排序
        Arrays.sort(people);
        int res = 0;
        int i = 0, j = people.length-1;
        while(i<=j){
   
            if(people[i] + people[j] <= limit){
                  
                i++;
            }
            res++;
            j--;        
        }
        return res;
    }

344. 反转字符串

问题

在这里插入图片描述

思路

原地修改,两个指针分别指向头尾,交换位置

    public void reverseString(char[] s) {
   
        int l = 0,r = s.length-1;
        while(l<r){
   
            char tmp = s[l];
            s[l] = s[r];
            s[r] = tmp;
            l++;
            r--;
        }
    }

27. 移除元素

问题

在这里插入图片描述
在这里插入图片描述

思路

原地移除且不考虑新长度后面的元素,可以将val元素移动到数组尾,需要双指针,一个遍历数组,一个从数组尾指向val移向的位置

https://blog.csdn.net/u012910051/article/details/110204289


167. 两数之和 II - 输入有序数组

问题

在这里插入图片描述
在这里插入图片描述

代码
    public int[] twoSum(int[] numbers, int target) {
   
        int l = 0,r = numbers.length-1;
        while(l<r){
   
            if(numbers[l]+numbers[r]==target){
   
                return new int[]{
   l+1,r+1};
            }else if(numbers[l]+numbers[r]<target){
   
                l++;
            }else{
   
                r--;
            }
        }
        return new int[]{
   };
    }

633. 平方数之和

问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

1.a 和 b一定小于根号c,找到中间值,双指针一个指向头,另一个指向中间值

    public boolean judgeSquareSum(int c) {
   
        int l= 0,r;
        r = (int)Math.sqrt(c);

        while(l<=r){
   
             if(Math.pow(l,2)+Math.pow(r,2)<c){
   
                l++;
            }else if(Math.pow(l,2)+Math.pow(r,2)>c){
   
                r--;
            }else {
   
                return true;
            }
        }
        return false;


    }
  1. 在枚举 a 之后,我们也可以直接使用 sqrt 函数直接找出 b。
时间复杂度:O(sqrt{
   c})
空间复杂度:O(1)public boolean judgeSquareSum(int c) {
   
        for (long a = 0; a * a <= c; a++) {
   
            double b = Math.sqrt(c - a * a);
            if (b == (int) b)
                return true;
        }
        return false;
    }

345. 反转字符串中的元音字母

问题

在这里插入图片描述

思路

头尾双指针,要注意元音字母大小写共10个.因为String是不可变量,所以用StringBuffer或者将s转成数组

    public String reverseVowels(String s) {
   
        if(s==null ||s.length()==0){
   
            return "";
        }
        StringBuffer sb = new StringBuffer(s);
        String yu = "aeiouAEIOU";
        char ll,rr;
        int l = 0,r = s.length()-1;
        while(l<r){
   
            ll = sb.charAt(l);
            rr = sb.charAt(r);

            if(yu.indexOf(ll)!=-1){
   
                while(yu.indexOf(rr)==-1){
   
                    r--;
                    rr = sb.charAt(r)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值