每日一题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]

思路一

先对数组进行排序得 ( a 0 , a 1 , . . . , a n ) (a_0,a_1,...,a_n) (a0,a1,...,an),然后令 x = a 0 , y = a n x=a_0,y=a_n x=a0,y=an,后面用 x + y x + y x+y的值与target对比,如果 x + y > t a r g e t x+y>target x+y>target则让y往左移,如果 x + y < t a r g e t x+y<target x+y<target则让x往右移,否则返回x和y的下标。

问题1.是否存在数组中有符合的x和y却找不到的情况?

答案是否定的,假设符合要求的元素是 a i , a j a_i,a_j ai,aj,那么必定有 0 ≤ i ≤ j ≤ n 0\leq i\leq j \leq n 0ijn,在 x , y x,y x,y向中间靠拢的时候必有一个先遇到目的位置(x先到达i或y先到达j),假如x先到达i,那么y还在j的右边,需要继续往左移直到j;假如y先到达j,那么x还在i的左边,需要继续往右移直到i。因此必然可以找到待定点。

问题2.由于返回的是数组下标,但排序的过程已经打乱了数组中元素的位置,如何才能返回数组下标呢?

需要提前开辟一个数组空间保存输入的数据数据,函数返回前通过x和y的值查找它们在原始数组中的下标。

代码

语言:c,时间复杂度: O ( n 2 ) O(n^2) O(n2)

/**
* 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) 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值