LeetCode刷题——双指针

LeetCode刷题——双指针

1、有序数组的 Two Sum
T167 Two Sum II - Input array is sorted (Easy)
LeetCode刷题——双指针_第1张图片

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

    }
};

2、两数平方和
T633 Sum of Square Numbers (Easy)
LeetCode刷题——双指针_第2张图片

class Solution {
public:
    bool judgeSquareSum(int c) {
        long a = 0;
        long b = sqrt(c);
        while(a<=b){
            if(a*a + b*b == c)
            return true;
            else if(a*a + b*b < c)
            ++a;
            else
            --b;
        }
        return false;

    }
};

3、反转字符串中的元音字符
T345 Reverse Vowels of a String (Easy)
LeetCode刷题——双指针_第3张图片

class Solution {
public:
    string reverseVowels(string s) {
        int i = 0;
        int j = s.size()-1;
        char tmp;
        while(i<j){
            if(isOrigin(s[i]) && isOrigin(s[j])){
                tmp = s[i];
                s[i] = s[j];
                s[j] = tmp;
                ++i;
                --j;
            }
            if(!isOrigin(s[i]))
            ++i;
            if(!isOrigin(s[j]))
            --j;
        }
        return s;

    }
    bool isOrigin(char m){
        if(m == 'a' || m == 'e' ||m == 'i' ||m == 'o' ||m == 'u' ||m == 'A' ||m == 'E' ||m == 'I' ||m == 'O' ||m == 'U' )
        return true;
        else return false;
    }
};

4、回文字符串
T680 Valid Palindrome II (Easy)
LeetCode刷题——双指针_第4张图片

class Solution {
public:
    bool validPalindrome(string s) {
        int i = 0;
        int j = s.size()-1;
        while(i<j){
            if(s[i] != s[j]){
                return isValid(s, i+1, j) || isValid(s, i, j-1);
            }
            ++i;
            --j;
        }
        return true;

    }
    bool isValid(string s, int i, int j){
        while(i<j){
            if(s[i] !=  s[j]) return false;
            ++i;
            --j;
        }
        return true;
    }
};

5、归并两个有序数组
T88 Merge Sorted Array (Easy)
LeetCode刷题——双指针_第5张图片

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i = m-1;
        int j = n-1;
        int k = m+n-1;
        while(i>=0 && j>=0){
            if(nums1[i] > nums2[j]){
                nums1[k--] = nums1[i--];
            }
            else
            nums1[k--] = nums2[j--];
        }
        while(j>=0){
            nums1[k--] = nums2[j--];
        }
    }
};

6、判断链表是否存在环
T141 Linked List Cycle (Easy)
LeetCode刷题——双指针_第6张图片

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow)
            return true;
        }
        return false;
        
    }
};

7、最长子序列
T524 Longest Word in Dictionary through Deleting (Medium)
LeetCode刷题——双指针_第7张图片

class Solution {
public:
    string findLongestWord(string s, vector<string>& d) {
        string res="";
        for(string str : d){
            int i = 0;
            for(char c : s){
                if(i<str.size() && c==str[i]){
                    ++i;
                }
                if(i==str.size() && str.size() >= res.size()){
                    if(str.size() > res.size() || str < res){
                        res = str;
                    }
                }
            }
        }
        return res;

    }
};

你可能感兴趣的:(leetcode刷题,leetcode,指针)