p2p網(wǎng)站怎么做視頻號(hào)的鏈接在哪
一、題目描述
給定一個(gè)整數(shù)數(shù)組 nums
和一個(gè)目標(biāo)值 target
,請你在該數(shù)組中找出和為目標(biāo)值 target
的那兩個(gè)整數(shù),并返回他們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會(huì)對(duì)應(yīng)一個(gè)答案。但是,數(shù)組中同一個(gè)元素不能使用兩遍。
你可以按任意順序返回答案。
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因?yàn)?nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:
輸入:nums = [3,3], target = 6
輸出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只會(huì)存在一個(gè)有效答案
二、題解
2.1 暴力查找
選取數(shù)組 nums
中的第一個(gè)數(shù) num
,用 target
減去,得到 another_num
,即 num +another_num = target
,在剩余的數(shù)中尋找 another_num
,如果存在,返回兩個(gè)數(shù)的索引。依次遍歷整個(gè)數(shù)組。
基本思路是這樣,但在 “在剩余的數(shù)中尋找num2” 這一步,尋找算法的好壞直接影響整體算法的效率。
因?yàn)閿?shù)組中同一個(gè)元素不能使用兩遍,這就在于 “在剩余的數(shù)中尋找num2” 中的 “剩余” 怎么實(shí)現(xiàn)了,不能簡單地使用 if another_num in nums
,需要將尋找的 num
從查找數(shù)組 nums
中剔除,這樣查找數(shù)組才是剩余的。
外循環(huán)確定 num
,內(nèi)循環(huán)查找 another_num
,由于內(nèi)循環(huán)從 i+1
開始,保證了查找數(shù)組中不包含 num
。
但暴力查找效率極低。
2.1.1 Python
def twoSum0(nums, target):for i in range(len(nums)):for j in range(i+1,len(nums)):if nums[i] + nums[j] == target:return [i,j]
2.1.2 C++
vector<int> twoSum(vector<int>& nums, int target)
{int n = nums.size();for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (nums[i] + nums[j] == target) {return {i, j};}}}return {};
}
2.1.3 C
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{for (int i = 0; i < numsSize; ++i) {for (int j = i + 1; j < numsSize; ++j) {if (nums[i] + nums[j] == target) {int* ret = malloc(sizeof(int) * 2);ret[0] = i, ret[1] = j;*returnSize = 2;return ret;}}}*returnSize = 0;return NULL;
}
2.1.4 復(fù)雜度分析
-
時(shí)間復(fù)雜度: O ( N 2 ) O(N^2) O(N2),其中 N N N 是數(shù)組中的元素?cái)?shù)量。最壞情況下數(shù)組中任意兩個(gè)數(shù)都要被匹配一次。
-
空間復(fù)雜度: O ( 1 ) O(1) O(1)。
2.2 哈希表查找
保持?jǐn)?shù)組中的每個(gè)元素與其索引相互對(duì)應(yīng)的最好方法是什么?哈希表。
使用 enumerate()
函數(shù)獲取 nums
列表元素和對(duì)應(yīng)索引,并將 another_num
及其對(duì)應(yīng)的索引存入字典,在原列表 nums
里遍歷 num
,在字典里尋找對(duì)應(yīng) another_num
。
2.2.1 Python
def twoSum1(nums, target):hashmap = {}for index, num in enumerate(nums):another_num = target - numif another_num in hashmap:return [hashmap[another_num], index]else:hashmap[num] = indexreturn None
2.2.2 C++
vector<int> twoSum(vector<int>& nums, int target)
{unordered_map<int, int> hashtable;for (int i = 0; i < nums.size(); ++i) {auto it = hashtable.find(target - nums[i]);if (it != hashtable.end()) {return {it->second, i};}hashtable[nums[i]] = i;}return {};
}
2.2.3 C
struct hashTable
{int key;int val;UT_hash_handle hh;
};struct hashTable* hashtable;struct hashTable* find(int ikey)
{struct hashTable* tmp;HASH_FIND_INT(hashtable, &ikey, tmp);return tmp;
}void insert(int ikey, int ival)
{struct hashTable* it = find(ikey);if (it == NULL) {struct hashTable* tmp = malloc(sizeof(struct hashTable));tmp->key = ikey, tmp->val = ival;HASH_ADD_INT(hashtable, key, tmp);} else {it->val = ival;}
}int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{hashtable = NULL;for (int i = 0; i < numsSize; i++) {struct hashTable* it = find(target - nums[i]);if (it != NULL) {int* ret = malloc(sizeof(int) * 2);ret[0] = it->val, ret[1] = i;*returnSize = 2;return ret;}insert(nums[i], i);}*returnSize = 0;return NULL;
}
2.2.4 復(fù)雜度分析
-
時(shí)間復(fù)雜度: O ( N ) O(N) O(N),其中 N N N 是數(shù)組中的元素?cái)?shù)量。對(duì)于每一個(gè)元素 x,我們可以 O ( 1 ) O(1) O(1) 地尋找
target - x
。 -
空間復(fù)雜度: O ( N ) O(N) O(N),其中 N N N 是數(shù)組中的元素?cái)?shù)量。主要為哈希表的開銷。