题目难度:简单
题目类型:数组
获得收货: java、C++、Python、Scala编程知识、两数之和解题思想、快排算法;
解题流程:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现(重点)。
你可以按任意顺序返回答案。
示例一:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
示例二:
输入:nums = [3,2,4], target = 6
输出:[1,2]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
Java实现:
本文采用快排算法(每次将一个元素放在正确位置);
首先,将原数组拷贝一份,即numsBak,然后 对数组nums进行排序(可以采用快排、归并等排序算法),然后对排好序的数组使用两个指针start和end向中间夹击,分三种情况:
(1)nums[start]+nums[end]>target,end减1;
(2)nums[start]+nums[end]
(3)nums[start]+nums[end]=target,返回结果;
最后在拷贝数组中找到满足条件的两个原始的下标;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
//快排算法
public void quickSort(int[] nums,int low,int high) {
int i=low, j=high;
if(i>=j)
return; //如果没有此判断会一一直递归,然后报栈溢出,
int elem = nums[low]; //不能放第一行,否则排好序退出时会导致ArrayIndexOutOfBoundsException
//经过一次快排,都会将一个元素放在正确位置,其左边元素比其小,右边元素比其大;
while(i elem) j--;
//如果while没有i target) end--;
else break;
}
int k=0;
for(int i=0;i=result[1])
System.out.println("数组中没有两个数之和等于target!");
else{
for(int i:result)
{
System.out.print(i);
System.out.print(" ");
}
}
}
}
C++实现:
参考大神们方法,采用哈希法思想,key为nums数组中的元素,val为数组中的元素在数组中的下标;num2=target-num1,如果num2在map中存在,则返回num1和num2在数组中的索引;
//#include
#include
#include