leetcode刷題筆記新地址(仍在更新)
https://github.com/MyLinChi/LeetcodeNote
問題描述
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路一
先對數組進行排序得,然後令,後面用的值與target對比,如果則讓y往左移,如果則讓x往右移,否則返回x和y的下標。
問題1.是否存在數組中有符合的x和y卻找不到的情況?
答案是否定的,假設符合要求的元素是,那麼必定有,在向中間靠攏的時候必有一個先遇到目的位置(x先到達i或y先到達j),假如x先到達i,那麼y還在j的右邊,需要繼續往左移直到j;假如y先到達j,那麼x還在i的左邊,需要繼續往右移直到i。因此必然可以找到待定點。
問題2.由於返回的是數組下標,但排序的過程已經打亂了數組中元素的位置,如何才能返回數組下標呢?
需要提前開闢一個數組空間保存輸入的數據數據,函數返回前通過x和y的值查找它們在原始數組中的下標。
代碼
語言:c,時間複雜度:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i, j, temp;
int * nums_backup = malloc(numsSize * sizeof(int));
for (i = 0; i < numsSize; i++)
*(nums_backup + i) = *(nums + i);
for (i = 0; i<numsSize; i++)
for (j = numsSize - 1; j>i; j--)
if (*(nums + j) < *(nums + j - 1)){
temp = *(nums + j);
*(nums + j) = *(nums + j - 1);
*(nums + j - 1) = temp;
}
int * returnValue = (int*)malloc(2 * sizeof(int));
for (i = 0, j = numsSize - 1; i<j;)
if (*(nums + i) + *(nums + j) == target){
int k;
for (k = 0; k < numsSize;k++)
if (*(nums_backup + k) == *(nums + i))
*returnValue = k;
else if (*(nums_backup + k) == *(nums + j))
*(returnValue + 1) = k;
*returnSize = 2;
free(nums_backup);
return returnValue;
}
else if (*(nums + i) + *(nums + j) < target){
i++;
}
else{
j--;
}
return returnValue;
}
思路二
變量數組中的每一個元素,然後通過查找target-b是否在也在集合中,並且兩個數的下標不能相同。
A = 輸入的數組
for b∈A
if (target-b)∈ A && (targer - b)的下標 != 當前下標
return (targer - b)的下標 ,當前下標
代碼
語言:python3 時間複雜度:
class Solution:
def twoSum(self, nums: list[int], target: int) -> list[int]:
for i in range(len(nums)):
if(target-nums[i] in nums and i != nums.index(target-nums[i])):
return [i,nums.index(target-nums[i])]
原題連接:https://leetcode-cn.com/problems/two-sum/