fucking-algorithm icon indicating copy to clipboard operation
fucking-algorithm copied to clipboard

双指针技巧秒杀七道数组题目 :: labuladong的算法小抄

Open utterances-bot opened this issue 3 years ago • 30 comments

文章链接点这里:双指针技巧秒杀七道数组题目

评论礼仪 见这里,违者直接拉黑。

utterances-bot avatar May 20 '21 15:05 utterances-bot

寻找链表的倒数第 n 个元素那个最后还要判断slow.next是不是Null

GreenHandTo avatar May 20 '21 15:05 GreenHandTo

奥 前面已经返回了。。

GreenHandTo avatar May 20 '21 15:05 GreenHandTo

142.环形链表II https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/kuai-man-zhi-zhen-shu-xue-tui-dao-by-yuhhen/ 这个数学证明比较好。

Feyl avatar Oct 15 '21 16:10 Feyl

反转数组c++一行代码{狗头}{狗头}

void reverseString(vector<char>& s) {
        for(int i = 0, j = s.size()-1; i <= j; ++i, --j)    swap(s[i], s[j]);
}

xiangyueerli avatar Feb 17 '22 16:02 xiangyueerli

167题,还能使用 二分查找+双指针,更优

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int i = 0, j = numbers.length - 1;
        while (i < j) {
            int m = (i + j) >>> 1;
            if (numbers[i] + numbers[m] > target) {
                j = m - 1;
            } else if (numbers[m] + numbers[j] < target) {
                i = m + 1;
            } else if (numbers[i] + numbers[j] > target) {
                j--;
            } else if (numbers[i] + numbers[j] < target) {
                i++;
            } else {
                return new int[]{i + 1, j + 1};
            }
        }
        return new int[]{0, 0};
    }
}

PeachLuis avatar Feb 28 '22 12:02 PeachLuis

第五题的代码是不是有问题啊

buptcaicai76 avatar Mar 25 '22 13:03 buptcaicai76

27题,左右指针解法

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        curr, tail = 0, len(nums) - 1
        while curr <= tail:
            if nums[curr] == val:
                nums[curr], nums[tail] = nums[tail], nums[curr]
                tail -= 1
            else:
                curr += 1
        return curr

billgoo avatar Apr 01 '22 09:04 billgoo

2022.4.2 mark

billgoo avatar Apr 02 '22 09:04 billgoo

第五题代码 是 有问题

King-Eternal avatar Apr 03 '22 06:04 King-Eternal

@King-Eternal @buptcaicai76 第五题有啥问题,我把代码复制过去提交通过了啊

labuladong avatar Apr 03 '22 12:04 labuladong

打卡2022.4.4

huahuablog avatar Apr 04 '22 14:04 huahuablog

这里好像有点问题:”高效解决这道题就要用到快慢指针技巧:我们让慢指针 slow 走在后面,快指针 fast 走在前面探路,找到一个不重复的元素就赋值给 slow 并让 slow 前进一步。“ 应该是先让slow前进一步,再赋值吧

gzz0204 avatar Apr 06 '22 12:04 gzz0204

@gzz0204 嗯,你说的有道理,我改下表述

labuladong avatar Apr 11 '22 04:04 labuladong

2022.4.17 打卡

Ref-Rain07 avatar Apr 17 '22 11:04 Ref-Rain07

厉害呀,跟着刷完了双指针的数组题目,感觉越来越得心应手

Maxiah avatar Apr 19 '22 03:04 Maxiah

第283题移动零的另一种解法,没必要再记住下标最后遍历赋值为0

class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != 0){
                int temp = nums[slow];
                nums[slow++] = nums[fast];
                nums[fast] = temp;
            }
        }
    }
}

YiwenXie avatar Apr 21 '22 12:04 YiwenXie

这个大概也算是双指针吧,另外一种移动零的解法,(前四题都可以用的)

public void moveZeroes(int[] nums) {
        int i = 0;
        int length = nums.length;
        for(int num : nums){
            if(num != 0){
                nums[i++] = num;
            }
        }
        while(i < length){
            nums[i++] = 0;
        }
    }

baoyun-chen avatar Apr 24 '22 02:04 baoyun-chen

打卡~

Sm1lence avatar Jun 06 '22 08:06 Sm1lence

打卡,感谢楼主!

bert82503 avatar Jun 08 '22 04:06 bert82503

使用C++解决第五题【最长回文子串】,貌似需要改写字符串子串结果返回代码:

class Solution {
public:
    string longestPalindrome(string s) {
        string res = "";
        for(int i = 0; i < s.length(); i++){
            string s1 = findPalindrome(s, i, i);
            string s2 = findPalindrome(s, i, i+1);
            res = res.length() > s1.length() ? res : s1;
            res = res.length() > s2.length() ? res : s2;
        }
        return res;
    }

    string findPalindrome(string& s, int l, int r){
        while(l >= 0 && r < s.length() && s[l] == s[r]){
            l--;
            r++;
        }

        return s.substr(l+1, r-l-1); // C++中的子串函数substr(pos, count),第二参数count是子串长度
    }
};

boonwt96 avatar Jun 22 '22 03:06 boonwt96

167两数之和C++ 注意+1

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int left=0,right=numbers.size()-1;
        while(left<right){
            int sum=numbers[left]+numbers[right];
            if(sum==target){
                return vector<int> {left+1,right+1};
            }
            else if(sum<target){
                left++;
            }
            else if(sum>target){
                right--;
            }

        }
        return vector<int>{-1,-1};
    }
};

GithubMingEnter avatar Jun 22 '22 07:06 GithubMingEnter

最後一題可以小優化一下,提前跳出for循環:

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    if (s.length === 1) return s
    
    let longest = ''
    
    for (let i = 0; i < s.length-1; i++) {
        
        let odd = palindrome(s, i, i)
        let even = palindrome(s, i, i+1)
        
        longest = longest.length < odd.length ? odd : longest
        longest = longest.length < even.length ? even : longest
        
        if (Math.ceil(longest.length / 2) >= s.length - i) break

    }
    
    function palindrome(s, l, r) {
        
        while (l >= 0 && r < s.length && s[l] === s[r]) {
            l --
            r ++
        }
        
        return s.slice(l+1, r)
    }
    
    return longest
};

求教大佬這個時間復雜度怎麼算呢?

convers39 avatar Jun 25 '22 03:06 convers39

打卡

deepbreath373 avatar Jul 05 '22 13:07 deepbreath373

二分查找框架的链接指向错误了

chaijinsong avatar Jul 07 '22 01:07 chaijinsong

滴滴滴打卡

LeeHaruYa avatar Jul 25 '22 02:07 LeeHaruYa

第五题的 s.substring(l + 1, r); 这个 l+1 会等于 length ,也就是越界的情况, 不太懂这个函数,不会报错吗?

fine-ypc avatar Jul 25 '22 09:07 fine-ypc

@fine-ypc 你仔细想想,不会等于 length 的。

labuladong avatar Jul 27 '22 01:07 labuladong

打卡

qingnichimi avatar Aug 02 '22 10:08 qingnichimi

最长回文子串---“从内向外找”比遍历所有子串快!因为12345中234不行,就不会判断12345是否可行。

yonggui-yan avatar Aug 09 '22 03:08 yonggui-yan

@labuladong 26题我能不能直接赋值给slow为0 fast为1,当nums[slow] 和 nums[fast]不相等时 往前各前进一步 def removeDuplicates(self, nums: List[int]) -> int: fast = 1 slow = 0

    while fast in range(len(nums)):
        if nums[slow] != nums[fast]:
            fast += 1
            slow += 1
        else:
            nums.pop(fast)
    
    return len(nums)

acyWEI avatar Aug 09 '22 22:08 acyWEI