1. 程式人生 > >leetcode(16-20)

leetcode(16-20)

16. 最接近的三數之和

給定一個包括 n 個整數的陣列 nums和 一個目標值 target。找出 nums中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。

例如,給定陣列 nums = [-1,2,1,-4], 和 target = 1.

與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).
class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int n = nums.size();
        int ret = 100000;
        sort(nums.begin(), nums.end());
        for(int i=0; i<n-2; i++){
            for (int j=i+1; j<n-1; j++) {
                for (int k=j+1; k<n; k++) {
                    if (abs(ret-target) > abs(nums[i]+nums[j]+nums[k]-target)){
                        ret = nums[i]+nums[j]+nums[k];
                    }
                }
            }

        }
        return ret;
    }
};

17. 電話號碼的字母組合

給定一個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。

給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。

示例:

輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

說明: 儘管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。

class Solution {
public:
    vector<string> letterCombinations(string& digits) {
        vector<string> res;
        int len = res.size();
        map<char,string> dic;
        string temp="";
        dic.insert(pair<char,string>('2',"abc"));
        dic.insert(pair<char,string>('3',"def"));
        dic.insert(pair<char,string>('4',"ghi"));
        dic.insert(pair<char,string>('5',"jkl"));
        dic.insert(pair<char,string>('6',"mno"));
        dic.insert(pair<char,string>('7',"pqrs"));
        dic.insert(pair<char,string>('8',"tuv"));
        dic.insert(pair<char,string>('9',"wxyz"));
        process(res,dic,digits,temp);
        return res;
    }
    void process(vector<string> &res, map<char,string> &dic, string digits, string temp) {
        if (digits.size() == 0) {
            if(temp != "")
                res.push_back(temp);
            return;
        }
        int len = dic[digits[0]].size();
        for (int i=0; i<len; i++) {
            process(res,dic,digits.substr(1),temp+dic[digits[0]][i]);
        }
    }
};

18. 四數之和

給定一個包含 n 個整數的陣列 nums 和一個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重複的四元組。

注意:

答案中不可以包含重複的四元組。

示例:

給定陣列 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

滿足要求的四元組集合為:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        set<vector<int>> res;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < int(nums.size() - 3); ++i)
        {
            for (int j = i + 1; j < int(nums.size() - 2); ++j) 
            {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                int left = j + 1, right = nums.size() - 1;
                while (left < right) 
                {
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum == target) 
                    {
                        vector<int> out{nums[i], nums[j], nums[left], nums[right]};
                        res.insert(out);
                        ++left; 
                        --right;
                    } else if (sum < target) ++left;
                    else --right;
                }
            }
        }
        return vector<vector<int>>(res.begin(), res.end());
 
    }
};

19. 刪除連結串列的倒數第N個節點

給定一個連結串列,刪除連結串列的倒數第 個節點,並且返回連結串列的頭結點。

示例:

給定一個連結串列: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.

說明:

給定的 n 保證是有效的。

進階:

你能嘗試使用一趟掃描實現嗎?

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (n==0) return head;
        ListNode* delLoc=head;
        ListNode* delTail=head;
        for (int i=0;i<n;i++){
            delTail = delTail->next;
        }
        if (delTail == NULL) {
            head = delLoc->next;
            delete delLoc;
            return head;
        }
        while (delTail->next != NULL) {
            delTail = delTail->next;
            delLoc = delLoc->next;
        }
        delLoc->next=delLoc->next->next;
        return head;
    }
}; 

給定一個只包括 '('')''{''}''['']' 的字串,判斷字串是否有效。

有效字串需滿足:

  1. 左括號必須用相同型別的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

示例 1:

輸入: "()"
輸出: true

示例 2:

輸入: "()[]{}"
輸出: true

示例 3:

輸入: "(]"
輸出: false

示例 4:

輸入: "([)]"
輸出: false

示例 5:

輸入: "{[]}"
輸出: true
class Solution {
public:
    bool isValid(string s) {
        stack<char> result;  
        int n=s.size();  
        if(n==0) return true;  
     for(int i=0;i<n;i++)  
            {  
                if(result.empty())  
                    result.push(s[i]);  
                else if(result.top()=='('&&s[i]==')'||  
                      result.top()=='['&&s[i]==']'||  
                      result.top()=='{'&&s[i]=='}')   
                        result.pop();  
                else  
                    result.push(s[i]);  
                  
            }  
            return result.empty();  
    }
};

(以上題目均摘自leetcode)