求解两元素之和等于给定值的两元素下标

题目来源于力扣–https://leetcode-cn.com/

给定一个值,找出数组中两个元素之和等于这个值的元素下标,并以数组的形式返回,顺序可以任意,给定的值只会对应一个答案,数组的元素不能重复输出,比如{1,1},这是不可行的。

一、暴力枚举
两个循环,枚举直到找到与给定值相同的两个元素,时间复杂度O(n²),空间复杂度O(1)

main函数下的代码

#include<stdio.h>
#include<malloc.h>
int* twoSum(int* nums, int numsSize, int target,int* returnSize);
int main(){
	int nums[4] = {3,6,16,20};
	int a = 0;
	int* returnSize = &a;
	int* temp = twoSum(nums,4,9,returnSize);
	for(int i=0;i<*returnSize;i++){
		printf("%d ",(*temp+i));
	}
	return 0;
}

求解两数位置的代码

int* twoSum(int* nums, int numsSize, int target,int* returnSize){
	int* temp = (int*)malloc(sizeof(int) * 2);
	*returnSize = 0;
	// 双层循环遍历查找两个数 
	for(int i=0;i<numsSize-1;i++){
		for(int j=i+1;j<numsSize;j++){
			if(nums[i]+nums[j]==target){
				temp[(*returnSize)++] = i;
				temp[(*returnSize)++] = j;
				// 返回数组 
				return temp; 
			}
		}
	}
	return temp;
}

二、可以使用一个哈希表来存储遍历过的元素,当target-当前元素得到的元素不在哈希表中时,将当前元素放入哈希表,否则返回当前元素的下标,和哈希表中的target-当前元素得到值得下标。时间复杂度O(n),空间复杂度O(n)。

java代码实现

package com.company;

import java.util.Arrays;
import java.util.Hashtable;

public class Main {

    public static void main(String[] args) {
        int [] nums = {3,6,16,20};
        int target = 9;
        int [] temp = twoSum(nums,target);
        System.out.print(Arrays.toString(temp));
    }



    public static int[] twoSum(int[] nums, int target){
        Hashtable<Integer,Integer> hashMap = new Hashtable<Integer,Integer>();
        for(int i=0;i<nums.length;i++){
            if(hashMap.containsKey(target - nums[i])){
                return new int[]{hashMap.get(target - nums[i]),i};
            }
            hashMap.put(nums[i],i);
        }

        return null;
    }
}

三、使用双指针法
双指针法 ,两个指针分别指向数组首端与末端,判断两数之和与目标值的大小关系,小于目标值,左指针往后移动,大于目标值右指针往前移动

int* twoSum(int* nums, int numsSize, int target,int* returnSize){
	int left = 0;
	int right = numsSize-1;
	* returnSize=2;
	int *temp = (int*)malloc(sizeof(int)*2)
	while(left<right){
		int sum = nums[left]+nums[right];
		if(sum>target){
			right--;
		}else if(sum<target){
			left++;
		}else{
			temp[0] = left;
			temp[1] = right;
		}
	}
	return temp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值