leetcode(16-20)
阿新 • • 發佈:2018-12-11
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個節點
給定一個連結串列,刪除連結串列的倒數第 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:
輸入: "()" 輸出: 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)