题目难度:简单
题目类型:数组
获得收货: 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]<target,start加1;
(3)nums[start]+nums[end]=target,返回结果;
最后在拷贝数组中找到满足条件的两个原始的下标;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**基本知识
* 在java中如果是基本类型(int、String等),则实参不会改变(值传递);
如果是对象(集合:Map、数组等),则实参会改变(传的是引用);*/
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<j){
while(i<j && nums[j] > elem) j--;
//如果while没有i<j,可能导致j--,出现nums[j]ArrayIndexOutOfBoundsException;
if(i<j) nums[i] = nums[j];
while(i<j && nums[i]<= elem) i++;
if(i<j) nums[j] = nums[i];
}
nums[i] = elem;
quickSort(nums,low,i-1);
quickSort(nums
因篇幅问题不能全部显示,请点此查看更多更全内容