1. 程式人生 > >167 Two Sum-Input array is sorted, 125 Valid Palindrome,344

167 Two Sum-Input array is sorted, 125 Valid Palindrome,344

wap urn upper NPU reverse ber bubuko 圖片 ==

技術分享圖片

註意這兩個元素不能是相同的。

技術分享圖片

技術分享圖片

解法一:二分查找法,逐一取數組中的值,然後second = target - numbers[i] , 用二分查找法求第二個值。

時間復雜度:O(nlongn)

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        //二分查找
        vector<int> result;
        int n = numbers.size();
        for(int i=0; i<n;i++){
            
int second = target - numbers[i]; int l = i+1, r = n-1; while(l<=r){ int mid = (l+r)/2; if(second < numbers[mid]){ //在左半部分 r = mid-1; } else if(second > numbers[mid]){
//在右半部分 l = mid+1; } else{ //返回索引,從1開始 result.push_back(i+1); result.push_back(mid+1); break; } } if(result.size()==2) break; }
return result; } };

解法三:對撞指針

使用兩個指針,若nums[i] + nums[j] > target 時,i++; 若nums[i] + nums[j] < target 時,j -- 。

時間復雜度:O(n)

技術分享圖片

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int n = numbers.size();
        int l = 0, r = n-1;
        while(l<r){
            if(numbers[l] + numbers[r] == target){
                int res[2] = {l+1, r+1};
                return vector<int>(res, res+2);
            }
            else if(numbers[l] + numbers[r] < target)
                l++;
            else
                r--;
        }
throw invalid_argument("The input has no solution."); } };

對撞指針的另一個題目:

技術分享圖片

技術分享圖片

技術分享圖片

空串也認為是回文串。若 isalnum() == true,則為字母或數字;使用toupper()將其轉換為大寫。

#include <ctype.h>
class Solution {
public:
    bool isPalindrome(string s) {
        int l = 0, r = s.size()-1;
        while(l<r){
            //跳過非字母和數字的字符
            while(!isalnum(s[l]) && l<r)
               l++;
            while(!isalnum(s[r]) && l<r)
               r--;
            //將字母或數字都轉化為大寫來比較是否相同
            if(toupper(s[l]) != toupper(s[r]))
               return false;
            l++;
            r--;
        }
        return true;
    }
};

344 Reverse String

技術分享圖片

還蠻簡單的,用了對撞指針的思想,交換首尾對應指針所指的元素的值。

class Solution {
public:
    string reverseString(string s) {
        int l = 0, r = s.size()-1;
        int mid = (l+r)/2;
        for(int i=0;i<=mid;i++){
            swap(s[l], s[r]);
            l++;
            r--;
        }
        return s;
    }
};

345

翻轉元音字母:aeiouAEIOU

技術分享圖片

技術分享圖片

class Solution {
public:
    bool is_vowel(char c){
        if((c==a)||(c==e)||(c==i)||(c==o)||(c==u)||(c==A)||(c==E)||(c==I)||(c==O)||(c==U))
            return true;
        else 
            return false;
    }
    string reverseVowels(string s) {
        int n = s.size();
        int l = 0, r = n-1;
        
        while(l<r){
            while(!is_vowel(s[l]) && l<r)
                l++;
            while(!is_vowel(s[r]) && l<r)
                r--;
            swap(s[l], s[r]);
            l++;
            r--;
        }
        return s;
    }
};

11

技術分享圖片

技術分享圖片

class Solution {
public:
int maxArea(vector<int> &height) {
    int m = 0;
    int i = 0, j = height.size() - 1;
    while (i < j) {
        //m = max(m, (j - i) * min(height[i], height[j]));
        //height[i] < height[j] ? i++ : j--;
        if(height[i] < height[j]){
            m = max(m, (j - i) * height[i]);
            i++;
        }
        else{
             m = max(m, (j - i) * height[j]);
             j--;
        }
    }
    return m;
}
};

167 Two Sum-Input array is sorted, 125 Valid Palindrome,344