题目来源于力扣–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;
}