LeetCode 第 1 號問題:兩數之和
題目描述
給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
題目解析
使用查找表來解決該問題。
設置一個 map 容器 record 用來記錄元素的值與索引,然後遍歷數組 nums。
- 每次遍歷時使用臨時變量 complement 用來保存目標值與當前值的差值
- 在此次遍歷中查找 record ,查看是否有與 complement 一致的值,如果查找成功則返回查找值的索引值與當前變量的值 i
- 如果未找到,則在 record 保存該元素與索引值 i
動畫描述
代碼實現
// 1. Two Sum
// https://leetcode.com/problems/two-sum/description/
// 時間複雜度:O(n)
// 空間複雜度:O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> record;
for(int i = 0 ; i < nums.size() ; i ++){
int complement = target - nums[i];
if(record.find(complement) != record.end()){
int res[] = {i, record[complement]};
return vector<int>(res, res + 2);
}
record[nums[i]] = i;
}
}
};
LeetCode 第 2 號問題:兩數相加
題目描述
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
題目解析
設立一個表示進位的變量carried
,建立一個新鏈表,把輸入的兩個鏈表從頭往後同時處理,每兩個相加,將結果加上carried
後的值作爲一個新節點到新鏈表後面。
動畫描述
代碼實現
/// 時間複雜度: O(n)
/// 空間複雜度: O(n)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *p1 = l1, *p2 = l2;
ListNode *dummyHead = new ListNode(-1);
ListNode* cur = dummyHead;
int carried = 0;
while(p1 || p2 ){
int a = p1 ? p1->val : 0;
int b = p2 ? p2->val : 0;
cur->next = new ListNode((a + b + carried) % 10);
carried = (a + b + carried) / 10;
cur = cur->next;
p1 = p1 ? p1->next : NULL;
p2 = p2 ? p2->next : NULL;
}
cur->next = carried ? new ListNode(1) : NULL;
ListNode* ret = dummyHead->next;
delete dummyHead;
return ret;
}
};