双指针
hxkovo
这个作者很懒,什么都没留下…
展开
-
剑指21 调整数组顺序使得奇数位于偶数前面
题目描述:代码如下:class Solution { public int[] exchange(int[] nums) {//快慢指针 同一起跑线 快指针是奇数就交换到前面 int left=0; int right=0;while (right<nums.length){ if(nums[right]%2!=0){ int temp=nums[left]; nums[left++]=nums[right]; .原创 2021-08-16 00:14:33 · 45 阅读 · 0 评论 -
LC3 无重复字符的最长字串
题目描述:代码如下:要注意记录长度的阶段!class Solution { public int lengthOfLongestSubstring(String s) { HashMap<Character, Integer> window = new HashMap<>(); int left=0,right=0; int length=Integer.MIN_VALUE; while (right原创 2021-07-13 01:34:44 · 75 阅读 · 0 评论 -
LC438 找到字符串中所有字母异位词
题目描述:代码如下:class Solution { public List<Integer> findAnagrams(String s, String p) { LinkedList<Integer> res = new LinkedList<>(); HashMap<Character, Integer> need = new HashMap<>(),window= new HashMap原创 2021-07-13 01:10:11 · 89 阅读 · 0 评论 -
LC567 字符串的排列
题目描述:代码如下:注意四个条件:窗口右移的时候需要更新什么?什么时候需要进行窗口左移?窗口左移的时候需要更新什么? 输出结果是在右移阶段还是左移阶段?class Solution { public boolean checkInclusion(String s1, String s2) { HashMap<Character, Integer> window =new HashMap<>(),need = new HashMap<>().原创 2021-07-13 00:35:25 · 75 阅读 · 0 评论 -
LC643 子数组的最大平均数
题目描述:代码如下:class Solution { public double findMaxAverage(int[] nums, int k) { int left=0,right=k-1;//滑动窗口 两个指针距离是固定的double maxsum;int sum=0;for(int i=0;i<k;i++){ sum+=nums[i];}maxsum=sum;while(right<nums.length-1){ sum-=nums[l原创 2021-06-30 00:16:02 · 57 阅读 · 0 评论 -
LC26 删除有序数组中的重复项
题目描述:代码如下:class Solution { public int removeDuplicates(int[] nums) {if(nums==null){ return 0;}if(nums.length==1){ return 1;}int i=0;for(int j=1;j<nums.length;j++){ if(nums[i]!=nums[j]){ nums[++i]=nums[j]; }}r原创 2021-06-09 20:37:56 · 103 阅读 · 0 评论 -
LC 524通过删除字母匹配到字典里最长单词
题目描述:思路:双指针!有两种方法:可以先遍历字符串字典,然后通过比较更新最长的单词。也可以先排序字符串字典,再遍历比较。代码如下:import java.util.List;class Solution { public String findLongestWord(String s, List<String> dictionary) { //方法1:先遍历,再比较/*String longgestWord="";int L1,L2;for(St原创 2021-05-25 23:46:56 · 57 阅读 · 0 评论 -
LC 633平方数之和
题目描述:思路:枚举法or双指针因为我们要得到两个数的平方和等于目标数,也就是说a和b的大小范围是在0到根号c之间的。(c为目标数)这里主要说一下为什么双指针可行,(设置两个指针,判断两个指针的平方和与目标数的大小,若大于,则右指针--,小于则左指针++)(右指针一开始赋值为(int)根号c)代码如下:class Solution { public boolean judgeSquareSum(int c) {/*//a,c都属于(0,根号c] //原创 2021-05-25 21:39:47 · 62 阅读 · 0 评论 -
LC 76最小覆盖子串
题目描述:思路:滑动窗口!设置两个指针,形成一个窗口,一个负责扩展,一个负责收缩范围,另外还要设置一个数组去维护这个窗口的大小。代码如下:class Solution { public String minWindow(String s, String t) {//滑动窗口 left,right两指针 left负责收缩子串以求最优,right负责扩展找子串//维护一个need[128]数组 还有一个needcount变量 if (t == null ||原创 2021-05-25 19:44:39 · 166 阅读 · 0 评论 -
LC 142环形链表Ⅱ
题目描述:思路:快慢指针!图解:代码如下:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public原创 2021-05-24 20:59:52 · 110 阅读 · 0 评论 -
LC 88合并两个有序数组
题目描述:思路:因为这两个数组已经排好序,我们可以把两个指针分别放在两个数组的末尾,即nums1 的m -1 位和nums2 的n -1 位。每次将较大的那个数字复制到nums1 的后边,然后向前移动一位。因为我们也要定位nums1 的末尾,所以我们还需要第三个指针pos,以便复制。在以下的代码里,我们直接利用m 和n 当作两个数组的指针,再额外创立一个pos 指针,起始位置为m+n-1。每次向前移动m 或n 的时候,也要向前移动pos。这里需要注意,如果nums1的数字已经复制完,不要原创 2021-05-23 01:19:40 · 213 阅读 · 0 评论