Leetcode记录库解题方法篇之二:双指针

Leetcode解题思路总结(Easy) 近来走上了Leetcode刷题之路,不过刷题背后更重要的是思路,掌握了方法,举一反三融会贯通。故在此我总结每道题的解题思路,按照题目从简单到难的顺序来列举。 292 Nim Game,传说中的一行代码搞定。属于很简单的博弈推理。 思路:假如只有1~3个石头,那我方肯定能赢,假若有4个石头,无论我取1~3个石头,对方总是能拿下最后一个石头,所以这时候我方必输。假若有5~7个石头,我能取对 阅读详情

简介

七、双指针

结论

一些很主观的东西,归根到底可能还是自己的实力不够:

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

题目

思路描述

  • 由于初始数组是有序的,所以我们可以使用双指针,左右搜索。
  • 如果当前的两个索引值之和小于target,我们就右移左索引
  • 如果大于target,我们就左移右索引
  • 相等我们就返回。

代码实现
java代码:

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] ans = new int[2];
        int idx = 0, n = numbers.length - 1, tmp;
        while (idx < n) {
            tmp = numbers[idx] + numbers[n];
            if (tmp == target) {
                ans[0] = idx + 1;
                ans[1] = n + 1;
                return ans;
            } else if (tmp < target) idx++;
            else n--;
        }

        return ans;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 拓展延伸

2 633. 平方数之和

题目

思路描述

  • 由于初始数组是有序的,所以我们可以使用双指针,左右搜索。
  • 如果当前的两个索引值之和小于target,我们就右移左索引
  • 如果大于target,我们就左移右索引
  • 相等我们就返回。

代码实现
java代码:

class Solution {
    public boolean judgeSquareSum(int c) {
        long sqrtC = (int)Math.sqrt(c);
        long a = 0, b = sqrtC, tmp = 0;
        while (a <= b) {
            tmp = a * a + b * b;
            if (tmp == c) return true;
            else if (tmp < c) a++;
            else b--;
        }
        
        return false;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 拓展延伸

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

题目

思路描述

  • 双指针前后扫
  • 虽然想到了可以用 set 把原因字符存起来,然后判断 s 中的字符是不是元音,这样就不会看起来这么一大片了,也不会进行多次判断,可能速度也会快点。但是实际操作起来发现速度没有这样快。
  • 时间复杂度O(1/2 * n),空间复杂度O(2n)

代码实现
java代码:

class Solution {
    public String reverseVowels(String s) {
        int h = 0, t = s.length() - 1;
        char tmp;
        char[] strArray = s.toCharArray();
        while(h < t){
            if(strArray[h] == 'a' || strArray[h] == 'e' || strArray[h] == 'i' || strArray[h] == 'o' || strArray[h] == 'u' ||
            strArray[h] == 'A' || strArray[h] == 'E' || strArray[h] == 'I' || strArray[h] == 'O' || strArray[h] == 'U'){
                if(strArray[t] == 'a' || strArray[t] == 'e' || strArray[t] == 'i' || strArray[t] == 'o' || strArray[t] == 'u' ||
                strArray[t] == 'A' || strArray[t] == 'E' || strArray[t] == 'I' || strArray[t] == 'O' || strArray[t] == 'U'){
                    tmp = strArray[h];
                    strArray[h] = strArray[t];
                    strArray[t] = tmp;
                    h++;
                    t--;
                } else {
                    t--;
                }
            } else {
                h++;
            }
        }

        return new String(strArray);
    }
}
  • 使用 set 判断是不是元音,速度没有上面的直观写法快。
class Solution {
    public String reverseVowels(String s) {
        HashSet<Character> set = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
        int h = 0, t = s.length() - 1;
        char tmp;
        char[] strArray = s.toCharArray();
        while(h < t){
            if(set.contains(strArray[h])){
                if(set.contains(strArray[t])){
                    tmp = strArray[h];
                    strArray[h] = strArray[t];
                    strArray[t] = tmp;
                    h++;
                    t--;
                } else {
                    t--;
                }
            } else {
                h++;
            }
        }

        return new String(strArray);
    }
}
  • 这样写也可以起到set的作用
class Solution {
    public String reverseVowels(String s) {
        String vowels = new String("aeiouAEIOU");
        int h = 0, t = s.length() - 1;
        char tmp;
        char[] strArray = s.toCharArray();
        while(h < t){
            if (vowels.indexOf(strArray[h]) > -1) {
                if (vowels.indexOf(strArray[t]) > -1) {
                    tmp = strArray[h];
                    strArray[h] = strArray[t];
                    strArray[t] = tmp;
                    h++;
                    t--;
                } else {
                    t--;
                }
            } else {
                h++;
            }
        }

        return new String(strArray);
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 难道就没有办法直接在原始的字符串上做操作吗?只能新建一个?

4 680. 验证回文字符串 Ⅱ

题目

思路描述

  • 双指针前后扫,如果没有遇到不相同的字符直接返回true;
  • 第一次遇到不同的字符,就头后移一位 || 尾前移一位,重新开始判断,再次遇到不一样的字符就返回false
  • 如果没有遇到就返回true。
  • 时间复杂度O(n),空间复杂度O(1)

代码实现
java代码:

class Solution {
    public boolean validPalindrome(String s) {
        return validPalindrome(s, 0, s.length() - 1, 1);
    }

    private boolean validPalindrome(String s, int h, int t, int del){
        while(h < t) {
            // System.out.print(s.charAt(h));System.out.println(s.charAt(t));
            if (s.charAt(h) == s.charAt(t)) {
                h++;
                t--;
            } else if (del == 1){
                del = 0;
                return validPalindrome(s, h + 1, t, del) || validPalindrome(s, h, t - 1, del);
            } else return false;
        }

        return true;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 注意事项

5 88. 合并两个有序数组

题目

思路描述

  • 先把大数组中的数据移到后半部分,然后在归并两个有序数组到大数组的前部。
  • 时间复杂度O(m + n),空间复杂度O(1)

代码实现
java代码:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = 0, i1 = n, i2 = 0, m2 = m - 1;
        int tmp;
        while (m2 > -1) {
            nums1[m2 + n] = nums1[m2--]; 
        }

        while(i1 < m + n && i2 < n) {
            if (nums1[i1] < nums2[i2]) {
                nums1[i++] = nums1[i1++];
            } else {
                nums1[i++] = nums2[i2++];
            }
        }

        while (i1 < m + n) {
            nums1[i++] = nums1[i1++];
        }

        while (i2 < n) {
            nums1[i++] = nums2[i2++];
        }
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 注意事项

6 141. 环形链表

题目

思路描述

  • 快慢指针
  • 时间复杂度O(m + n),空间复杂度O(1)

代码实现
java代码:

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) return false;

        ListNode fast = head.next, slow = head;
        while (fast != slow && fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        if (fast == slow) return true;
        else return false;
    }
}

注意事项

  1. 循环条件和循环体的判断,再循环条件中一定要把fast.next.next之前的两个fast和fast.next都要判断了。
        while (fast != slow && fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }

拓展延伸

  1. 注意事项

7 524. 通过删除字母匹配到字典里最长单词

题目

思路描述

  • 快慢指针
  • 时间复杂度O(m + n),空间复杂度O(1)

代码实现
java代码:

class Solution {
    public String findLongestWord(String s, List<String> dictionary) {
        int maxl = 0, i, j;
        String res = "";
        for (String d : dictionary) {
            i = 0;
            j = 0;
            while (i < s.length() && j < d.length()) {
                if (s.charAt(i) == d.charAt(j)) {
                    j++;
                }
                i++;
            }

            if (j == d.length()) {
                if (maxl < j || (maxl == j && res.compareTo(d) > 0)) {
                    maxl = j;
                    res = d;
                }
            }
        }

        return res;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. 注意事项

8 剑指 Offer 57 - II. 和为s的连续正数序列

题目

思路描述

  • 一旦涉及到求一个范围、一段连续的元素的问题,考虑使用双指针
  • 时间复杂度O(n),空间复杂度O(1)

代码实现
java代码:

class Solution {
    public int[][] findContinuousSequence(int target) {
        int halftarget = target >> 1;
        int l = 1, r = 1, sum = 0;
        
        ArrayList<int[]> ans = new ArrayList<>();

        while (l <= halftarget) {
            if (sum == target) {
                int[] tmp = new int[r - l];
                for (int i = l, j = 0; i < r; i++, j++) {
                    tmp[j] = i;
                }
                ans.add(tmp);
                sum -= l;
                l++;
            } else if (sum < target) {
                sum += r;
                r++;
            } else {
                sum -= l;
                l++;
            }
        }

        return ans.toArray(new int[ans.size()][]);
    }
}

注意事项

  1. 注意事项

拓展延伸
1.

// Integer 范型的 List 转化成 int[] 的方法
list1.stream().mapToInt(Integer::valueOf).toArray()

9 42. 接雨水

题目

思路描述

  • 单调栈
  • 时间复杂度O(n),空间复杂度O(n)

代码实现
java代码:

class Solution {
    public int trap(int[] height) {
        int ans = 0, n = height.length;
        Deque<Integer> s = new LinkedList<>(); // 注意!!!里面放的时索引!!!
        for (int i = 0; i < n; i++) {
            while (!s.isEmpty() && height[i] > height[s.peek()]) { // 如果当前要进栈的高度大于栈顶,那么就可能形成一个凹槽:高 低 高
                int low = s.pop(); // 凹槽的底部高度,我们下面称它为“低”
                if (s.isEmpty()) { // 如果栈中此时没有元素了,那么也就构不成凹槽了,只有:低 高
                    break; // 中断
                }
                int l = s.peek(); // 如果栈中此时还有元素,查看这个元素的高度
                if (height[l] == height[low]) { // 如果这个元素的高度和低一样高,那么说明此时的凹槽张这样:(未知)低低高
                    continue; // 我们提前开启下一次循环,寻找左边的高度
                } else { // 如果这个元素的高度比:低 高
                    int w = i - l - 1; // 那么我们计算这个凹槽的宽度
                    int h = Math.min(height[i], height[l]) -  height[low]; // 计算这个凹槽的高度:两个较矮的高边 - 凹槽的低
                    ans += w * h; // 计算容量,累加
                }
            }
            s.push(i); // 新高度入栈
        }

        return ans;
    }
}

思路描述

代码实现
java代码:

class Solution {
    public int trap(int[] height) {
        int l = 0, r = height.length - 1, ans = 0;
        int lmax = height[0], rmax = height[r];
        while (l < r) {
            lmax = Math.max(lmax, height[l]); // 更新左边的高边
            rmax = Math.max(rmax, height[r]); // 更新右边的高边
            if (height[l] < height[r]) { // 如果左边现在的高度小于右边,那么现在至少出现了这个样一个凹槽 lmax...height[l] ... height[r],并且height[r]也是一定高于lmax的(自己想想,或者模拟以下,这个不太好用文字说明)
                ans += lmax - height[l]; // 求这个凹槽能称多少水
                l++;
            } else {
                ans += rmax - height[r];
                r--;
            }
        }

        return ans;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. a

10 76. 最小覆盖子串

题目

思路描述

  • 双指针,滑动窗口,计数法
  • 时间复杂度O(n),空间复杂度O(1)

代码实现
java代码:

class Solution {
    public String minWindow(String s, String t) {
        int slen = s.length(), tlen = t.length();
        if (slen < tlen) {
            return "";
        }

        int[] need = new int[128]; // 桶,用来记录目标串t中各个字符的数量,表示我们需要找到多少对应的字符来覆盖目标串
        for (int i = 0; i < tlen; i++) {
            need[t.charAt(i)]++;
        }

        int l = 0, r = 0, cnt = tlen; // cnt 是我们需要找到的目标字符数量
        int min = slen + 1, start = 0, end = 0;
        while (r < slen) {
            while (cnt != 0 && r < slen) {
                if (need[s.charAt(r)] > 0) { // 如果字符串s当前的字符和目标中的的一致
                    cnt--; // 找到了一个覆盖字符,需要的字符减一
                }
                need[s.charAt(r)]--; // 对应的 需要字符 的桶中数量减一,即使是不需要的字符也会减一
                r++; // 右移右指针
            }

            while (l < r && cnt == 0) { // 移动左指针缩小滑动窗口的大小
                if (need[s.charAt(l)] < 0) { // 如果当前的字符不是覆盖字符中的一个,说明可以向右移动左指针
                    need[s.charAt(l)]++; // 窗口缩小,need中的字符也要对应变化
                    l++; // 右移指针
                } else { // 如果当前扫描到的字符是覆盖字符中的一个,说明此时在缩小窗口的话,就不能够再覆盖目标串了
                    if (min > r - l) { // 判断当前的窗口大小和之前记录的窗口大小关系
                        min = r - l;
                        start = l;
                        end = r;
                    }
                    need[s.charAt(l)]++; // 窗口变小,没有被窗口覆盖的字符增多
                    l++; // 左指针右移
                    cnt++; // 需要的字符个数 + 1
                    break; // 此时已经窗口中的字符已经覆盖不了目标串了,再遍历也没有用,不如重新右移右指针,遍历未搜索的s中的字符
                }
            }
        }

        return s.substring(start, end);
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. a

11 2024. 考试的最大困扰度

题目

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

代码实现
java代码:

// 字符串的问题,想到了用动态规划(行不行呢?好像不行,还得分情况记录状态),但是忘了滑动窗口
// 滑动窗口离不了双指针

class Solution {
    public int maxConsecutiveAnswers(String answerKey, int k) {
        int len = answerKey.length();
        if (len < 2) return len; // 特殊情况判断

        return Math.max(getMax(answerKey, k, 'T'), getMax(answerKey, k, 'F')); // 可能是连续的 T 也可能是连续的 F
    }

    private int getMax(String answerKey, int k, char flag) {
        int l = 0, r = 0; // 双指针
        int max = 1, cnt = 0, len = answerKey.length();
        while (r < len) {
            cnt += answerKey.charAt(r) == flag ? 0 : 1; // 记录窗口内和目标字符 flag 不同的字符个数,使用 k 次修改机会对其进行修改
            while (cnt > k) { // 如果当前窗口内记录的和 flag 字符不同的字符个数大于了 k,此时需要缩小滑动窗口了,一直到 cnt == k 停止
                cnt -= answerKey.charAt(l++) == flag ? 0 : 1;
            }
            max = Math.max(max, r - l + 1); // 更新最大长度
            r++;
        }

        return max;
    }
}

注意事项

  1. 注意事项

拓展延伸

  1. a
【学习系列】SAP RAP 3:添加多层级的子节点 本文详细介绍了在SAP ABAP RAP开发中如何创建多层级业务对象。主要内容包括:1)创建明细和计划行层级的数据库表及CDS视图;2)使用association和composition关键字建立父子关联关系;3)创建各层级的投影视图并设置层级关系;4)更新行为定义,添加关联、操作权限等控制;5)更新服务定义公开新增视图;6)创建元数据扩展优化UI展示。通过这一系列步骤,实现了从抬头到明细再到计划行的完整业务对象层级结构,为后续UI功能扩展奠定了基础。 阅读详情

相关推荐

Shopee商品详情页反爬实战:手把手逆向x-sap-Ri和x-sap-Sec参数(附完整调试过程)

本文详细解析了Shopee商品详情页反爬机制中的x-sap-Ri和x-sap-Sec参数逆向过程。通过JS逆向技术,从环境数据采集到多层哈希运算,完整拆解了这两个关键参数的生成逻辑,并提供了实战技巧和Node.js实现方案,帮助开发者应对Shopee的动态加密挑战。

weixin_33701251的博客 1595

leetCode解题记录2 - 两数相加(JS, TS, PY版)

作者:陈大鱼头 项目地址:ying-leetcode 碎碎念:Mmmmm,不定期刷leetcode,会以JS TS PY的形式输出出来 题目描述 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不...

鱼头的Web海洋 1228

大数据应用技术实验报告一 Hadoop三种模式安装配置

JDK+Hadoop安装配置、单机模式配置 以下操作在SecureCRT里面完成 1.关闭防火墙 firewall-cmd --state 显示防火墙状态running/not running systemctl stop firewalld 临时关闭防火墙,每次开机重新开启防火墙 systemctl disable firewalld 禁止防火墙服务。 2.传输JDK和HADOOP压缩包 Sec...

Ruthless_Childe的博客 3089

leetCode解题记录3 - 无重复字符的最长子串(JS,PY,TS版)

作者:陈大鱼头 项目地址:ying-leetcode 碎碎念:Mmmmm,不定期刷leetcode,会以JS TS PY的形式输出出来 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: ...

鱼头的Web海洋 994

浮栅晶体管原理深度解析:热电子注入与FN隧穿如何实现1/0存储

本文深入解析了浮栅晶体管的工作原理,重点探讨了热电子注入与FN隧穿机制如何实现1/0存储。作为现代闪存芯片的核心技术,浮栅晶体管通过独特的结构设计实现非易失性存储,文章详细分析了其编程与擦除的物理过程,并对比了两种机制的优缺点,为闪存性能优化提供了理论基础。

weixin_30363285的博客 372

(SCADA)监控与数据采集系统

SCADA应用于监控和采集数据来控制工业过程软件。它通过收集和传输实时数据,帮助操作员监视和控制各种设备和过程。

软件技术的专栏 4541

数据结构Leetcode(二)

集合 ListSet: TreeSet(红黑树):存储元素必须具备可比较性。 349. 两个数组的交集

wm_mmmmm的博客 277

C# Log4Net不输出日志的解决方法

log4net是一个流行的 .NET 日志框架,用于记录应用程序的日志信息。如果你在使用log4net。

精通搬砖,资深技术砖家,在软件开发,人工智能,设备开发等领域都有研究。商业合作&交流学习可私信联系。 1263

力扣(leetcode)题目总结——双指针篇

本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目,一共100多道题,每道题都给出了非常详细的解题思路、算法步骤、代码实现。因为力扣题目顺序是随机的,并没有按照算法分类,导致同一类型的算法强化训练不够。所以本系列文章就是来帮你完成算法分类,针对每种算法做强化训练,保证让你以后遇到题目直接秒杀。本篇文章主要是针对双指针相关的算法题,一次性帮你搞定所有双指针题!

weixin_46571171的博客 1637

pytorch实现基本的logistic和softmax回归实验(手动+torch)

前提:不是前馈神经网络,没有隐藏层。 一:Logistic回归实验–人工构造数据集,手动构造模型 要求: 动手从0实现logistic回归,实现二分类,人工构造数据集,并分析loss、训练集、测试集的准确率。(要求从零实现二元交叉熵) 实验过程: 1.1人工构造数据集 1. # #自定义数据---训练集 2. num_inputs = 2 3. n_data = torch.ones(1500, num_inputs) # 数据的基本形态 4. x1 = torch.normal(2 * n_d

qq_37534947的博客 1万+

实用指南:制作通用的INCA和CANape兼容A2L文件

A2L(ASAM MCD-2 Measurement and Calibration Data)文件是描述ECU(电子控制单元)测量和校准数据的标准文件格式。在标定工作中,A2L文件扮演着极为重要的角色,它定义了测量通道、校准参数等关键信息,为工程师提供了统一的描述方式。INCA和CANape是两种常见的汽车电子系统标定工具,分别由ETAS和Vector公司开发。它们在汽车电子系统的开发和调试过程中发挥着重要作用,提供了丰富的标定功能和用户友好的界面。

一直在水些技术小文 2922

力扣数组之双指针

双指针就是在纸上画多个指针,然后推演,比如快慢指针,前后指针等等!!!外加一个index存放新数组的下标。

2301_78138281的博客 1183

CE电流法测试中的dBμV负值解析

传导发射(CE)电流法测试中出现的dBμV负值现象表明被测设备干扰电平低于1μV参考基准。这源于对数计算特性(小于1μV的电压转换后为负值)、设备优良的EMC设计(如滤波效果显著)及测试环境的影响(LISN隔离、屏蔽室低噪声)。负值虽不代表实际负电压,但反映干扰水平优于标准限值,为系统集成预留电磁裕度。工程应用中需结合设备灵敏度、环境背景噪声等因素综合分析,避免误判,这类数据可用于评估EMI设计冗余度。

硬核科技 297

掌握这15种模式后,力扣(LeetCode)不再难

在掌握这15种模式之前,力扣(LeetCode)对我来说一直很难。

硅基创想家的博客 4302

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode 热题 HOT 100 题解(仅记录解题思路)

由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。指针p1在头结点处,指针p2在头结点的next处,然后p1每次移动1格,p2则走2步,若在其中一个进入null之前两者指向同一结点,则代表有环。使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

a131529的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

力扣(leetcode)题目总结——动态规划篇

本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目,一共100多道题,每道题都给出了非常详细的解题思路、算法步骤、代码实现。因为力扣题目顺序是随机的,并没有按照算法分类,导致同一类型的算法强化训练不够。所以本系列文章就是来帮你完成算法分类,针对每种算法做强化训练,保证让你以后遇到题目直接秒杀。本篇文章主要是针对动态规划相关的算法题,一次性帮你搞定所有动态规划题!

weixin_46571171的博客 3065

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

代码随想录——力扣刷题笔记之双指针法

对于字符串,我们就定义两个指针(或者说是索引下标),一个从字符串前面往后扫描,一个从字符串后面往前扫描,两个指针同时向中间移动,在移动的过程中实现元素交换。双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。

m0_49651195的博客 1220

Leetcode力扣解题记录--第27题(双指针)

在一开始时,慢指针slow和快指针都处于0号位置,但是在算法的进行过程中,遇到目标值val时,fast指针会跳过,所以fast始终是大于等于slow,再将非目标值赋值给nums[slow],最终返回slow,也就是新的不含val值的最后一个元素的下标。简单思想:两层for循环,遇到val值第二层for循环把后续的元素依次往前移动,进入一次二层循环flag就加一,最后返回nums.size() - flag就行了。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。

qq_44846784的博客 1937

LeetCode解题总结--双指针

双指针解题多用于链表、数组等问题当中。 双指针的难度在于: 1、一开始可能很难想到 2、变式很多 3、指针并不是具体指的函数中的“指针”,而是一种思想。例如设置两个不同的可动标志位,也是”双指针“ 下面以具体的LeetCode题目补充解释: 题目汇总: 26. 删除排序数组中的重复项 80. 删除排序数组中的重复项 II 86. 分隔链表 141. 环形链表 (经典题,引...

Dylan的博客 540

Leetcode 刷题笔记(九) —— 解题方法:双指针

在前边几篇文章中很多题目都有大量用到双指针法,这里将这些常见题目做一个汇总,再做了一遍。还有前边没提到了 n 数之和 问题

a1241692733的博客 1320

力扣(leetcode)题目总结——字符串篇

本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目,一共100多道题,每道题都给出了非常详细的解题思路、算法步骤、代码实现。因为力扣题目顺序是随机的,并没有按照算法分类,导致同一类型的算法强化训练不够。所以本系列文章就是来帮你完成算法分类,针对每种算法做强化训练,保证让你以后遇到题目直接秒杀。本篇文章主要是针对字符串相关的算法题,一次性帮你搞定所有字符串题!

weixin_46571171的博客 4778

Leetcode记录库解题方法篇之一:计数法

Leetcode记录库数据结构篇之五:字符串简介五、字符串结论1 242. 有效的字母异位词2 409. 最长回文串3 205. 同构字符串3 128. 最长连续序列 简介 五、字符串 结论 一些很主观的东西,归根到底可能还是自己的实力不够: 1 242. 有效的字母异位词 题目 思路描述 使用HashMap的思想 遍历第一个字符串记录每一个字符的出现次数,然后遍历第二个字符串的过程中减少字符的次数,最后查看所有字符的出现次数是不是归零了。 代码实现 java代码: class Solution {

NotLency的博客 240

力扣热题 100:双指针专题四道题详细解析(JAVA)

今天,我们就来详细解析热题 100 中与双指针相关的四道题,帮助大家更好地理解解题思路和技巧。以上就是力扣热题 100 中与双指针相关的四道题的详细解析,希望对大家有所帮助。每个容器的宽度为 1,两个容器之间的距离为它们的下标之差。求能盛最多水的容器的面积。我们可以先对数组进行排序,然后使用双指针来查找和为零的三元组。每个柱子的宽度为 1,两个柱子之间的距离为它们的下标之差。解释:最大的面积是由高度为 7 和 8 的容器组成的,面积为 7 * 7 = 49。移动到数组的末尾,同时保持非零元素的相对顺序。

m0_72686196的博客 1410

Leetcode力扣解题记录--第11题(双指针法)

​盛最多水的容器 - 力扣(LeetCode)给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

qq_44846784的博客 942

力扣hot100算法解题思路总结

qq_69490950的博客 1122

力扣每日一练之双指针2Day9

力扣每日一练之双指针2Day9 🍕前面的话🥞 大家好!本篇文章将介绍20天算法刷题计划的题,本文将以两道题作为背景,介绍经典的双指针,展示语言为java(博主学习语言为java)。今天呢,是博主开始刷力扣的第九天,如果有想要开始准备自己的算法面试的同学,可以跟着我的脚步一起,共同进步。大家都是并肩作战的伙伴,一起努力奋力前行,路漫漫其修远兮,吾将上下而求索,相信我们一定都可以拿到自己期望的offer,冲冲冲! 👩‍💻博客主页:京与旧铺的博客主页 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csd

qq_46272491的博客 762
上一篇: Leetcode记录库数据结构篇之二:树
下一篇: Leetcode记录库数据结构篇之三:栈和队列
LencyGe
博客等级 码龄7年 26粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值