3-6对撞指针

目录

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

LeetCode 125 验证回文串  

LeetCode 344 反转字符串  

LeetCode 345 反转字符串中的元音字母  

LeetCode 11盛最多水的容器


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

解法1:暴力 该方法超时

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        //方法1:暴力法
        int n=numbers.size();
        int i=0;
        int j=0;
        vector<int > res;

        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
            {
                if(numbers[i]+numbers[j]==target)
                {
                    res.push_back(i+1);
                    res.push_back(j+1);
                    break;

                }
            }
        }
        return res;

    }
};

解法2:二分查找

class Solution {
public:
    
    //在numbers[l...r]中找target
    //找到返回下标,找不到返回0
    int binarysearch(vector<int>& numbers,int l,int r,int target)
    {
        while(l<=r)
        {
            int mid=l+(r-l)/2;
            if(numbers[mid]==target)
            {
                return mid;
            }
            else if(numbers[mid]<target)
            {
                l=mid+1;
            }
            else if(numbers[mid]>target)
            {
                r=mid-1;
            }
        }
        return 0;
    }

    vector<int> twoSum(vector<int>& numbers, int target) {
        //方法2:二分查找法
        int n=numbers.size();
        int i=0;
        vector<int> res;
        for(i=0;i<n;i++)
        {
            //在剩下不部分找target-numbers[i]
            int ret=binarysearch(numbers,i+1,n-1,target-numbers[i]);
            if(ret!=0)
            {
                res.push_back(i+1);
                res.push_back(ret+1);
            }
        }
        return res;
    }
};

解法3:对撞指针

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

LeetCode 125 验证回文串  

方法1:筛选+翻转判断:

    /*
    int isalnum(int c);
    作用:判断字符c是否是字母或数字
    返回值:
        0,不是字母和数字
        非0,是字母和数字

    int tolower(int c);
    作用:将c转换成小写
    返回值:转换后的字符
    */

class Solution {
public:
    bool isPalindrome(string s) {
        string sgood;
        for (char ch: s) {
            if (isalnum(ch)) {
                sgood += tolower(ch);
            }
        }
        string sgood_rev(sgood.rbegin(), sgood.rend());
        return sgood == sgood_rev;
    }
};

方法2:筛选+对撞指针判断:

class Solution {
public:
    bool isPalindrome(string s) {
        string s1;
        for(auto i:s)
        {
            if(isalnum(i))
            s1+=tolower(i);
        }
        //用对撞指针判断
        int i=0;
        int j=s1.size()-1;
        while(i<j)
        {
            if(s1[i]!=s1[j])
            {
                return false;
            }
            else
            {
                i++;
                j--;
            }
        }
        return true;
    }
};

方法3:在原字符串上直接判断:

class Solution {
public:
    bool isPalindrome(string s) {
        int n = s.size();
        int left = 0, right = n - 1;
        while (left < right) {
            //从左往右找是字母或数字的字符
            while (left < right && !isalnum(s[left])) {
                ++left;
            }
            //从右往左找是字母或数字的字符
            while (left < right && !isalnum(s[right])) {
                --right;
            }
            //表示还没有判断完
            if (left < right) {
                //如果两者不等,就说明不是回文,返回false
                if (tolower(s[left]) != tolower(s[right])) {
                    return false;
                }
                ++left;
                --right;
            }
        }
        return true;
    }
};

LeetCode 344 反转字符串  

方法1:对撞指针,互相交换

class Solution {
public:
    void reverseString(vector<char>& s) {
        int n=s.size();
        int i=0;
        int j=n-1;
        while(i<j)
        {
            swap(s[i],s[j]);
            i++;
            j--;
        }
    }
};

方法2:递归

class Solution {
public:
    void reverseString(vector<char>& s) {
        int n=s.size();
        if(n<2)
        return ;
        int l=0;
        int r=n-1;
        reverses(s,l,r); 
    }
    void reverses(vector<char>&s,int l,int r)
    {
        if(l>=r)
        return;
        swap(s[l],s[r]);
        reverses(s,++l,--r);
    }
};

LeetCode 345 反转字符串中的元音字母  

方法1:

class Solution {
public:
    //判断字符c是否是元音字母,是的话返回true,否则返回false
    bool isv(int c)
    {
        if(c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='A' || c=='E' || c=='I' || c=='O' || c=='U' )
        return true;
        return false;
    }

    string reverseVowels(string s) {
        int n=s.size();
        int i=0;
        int j=n-1;
        while(i<j)
        {
            while(i<j&& !isv(s[i]))
            {
                i++;
            }
            while(i<j&& !isv(s[j]))
            {
                j--;
            }
            if(i<j)
            {
                swap(s[i],s[j]); //交换两个元音字母
                i++;
                j--;
            }
        }
        return s;
    }
};

方法2:

class Solution {
private:
    set<char> dict={'a','o','e','i','u','A','O','E','I','U'};
public:
    // 题解:首尾指针,类比快排代码
    string reverseVowels(string& s) {
        int i=0,j=s.size()-1;
        while(i<j)
        {
            while(!dict.count(s[i])&&i<j)i++;
            while(!dict.count(s[j])&&i<j)j--;
            if(i<j)swap(s[i++],s[j--]);
        }
        return s;
    }
};

LeetCode 11盛最多水的容器

方法1:对撞指针,哪边低移动哪边

class Solution {
public:
    int maxArea(vector<int>& height) {
        int l = 0, r = height.size() - 1;
        int ans = 0;
        while (l < r) {
            int area = min(height[l], height[r]) * (r - l);
            ans = max(ans, area);
            if (height[l] <= height[r]) {
                ++l;
            }
            else {
                --r;
            }
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_38062470/article/details/114309258
3-6