【刷题笔记】链表 - 双指针

94 阅读1分钟

题目集

1. 两数之和 II

原题链接:167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

笔记:

在数组中求两个数字的和等于某个值,使用双指针,从头和尾分别开始查,类似二分;

代码:

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 {left+1, right+1};
            }
            else if(sum<target){
                left++;
            }
            else{
                right--;
            }
        }
        return {-1, -1};
    }
};

2. 最长回文子串

原题链接:5. 最长回文子串 - 力扣(LeetCode)

笔记:

由于回文串长度可能是偶数,也可能是奇数;

--> 从中间向两边搜索;

且因此,如果回文串的长度为奇数,则它有一个中心字符;如果回文串的长度为偶数,则可以认为它有两个中心字符;

--> 搜两次;

代码:

class Solution {
public:
    string longestPalindrome(string s) {

        string res = "";

        for(int i=0; i<s.length(); i++){
            string s1 = palindrome(s, i, i);
            string s2 = palindrome(s, i, i+1);

            res = res.length()>s1.length()?res:s1;
            res = res.length()>s2.length()?res:s2;

        }

        return res;
    }

    string palindrome(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);
    }
};