每日一題1.求數組中使得x + y爲某個數的x,y的下標

leetcode刷題筆記新地址(仍在更新)

https://github.com/MyLinChi/LeetcodeNote

問題描述

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

示例:

給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路一

先對數組進行排序得(a0,a1,...,an)(a_0,a_1,...,a_n),然後令x=a0,y=anx=a_0,y=a_n,後面用x+yx + y的值與target對比,如果x+y>targetx+y>target則讓y往左移,如果x+y<targetx+y<target則讓x往右移,否則返回x和y的下標。

問題1.是否存在數組中有符合的x和y卻找不到的情況?

答案是否定的,假設符合要求的元素是ai,aja_i,a_j,那麼必定有0ijn0\leq i\leq j \leq n,在x,yx,y向中間靠攏的時候必有一個先遇到目的位置(x先到達i或y先到達j),假如x先到達i,那麼y還在j的右邊,需要繼續往左移直到j;假如y先到達j,那麼x還在i的左邊,需要繼續往右移直到i。因此必然可以找到待定點。

問題2.由於返回的是數組下標,但排序的過程已經打亂了數組中元素的位置,如何才能返回數組下標呢?

需要提前開闢一個數組空間保存輸入的數據數據,函數返回前通過x和y的值查找它們在原始數組中的下標。

代碼

語言:c,時間複雜度:O(n2)O(n^2)

/**
* 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 時間複雜度:O(n)O(n)

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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章