最初的想法(但是失败了,想的太过复杂,且太长了)
…
/*思路如下:1.新创建一个数组,将原数组从小到大排序之后代入(排序操作)
2.再对该数组进行截取,比大于target的值删去(开始想的是这样,然后再暴力算法)
2.1 创建两个数组,第一个数组删去所有比target/2 要大 的值
第二个数组删去比target/2 要小的值
在进行暴力算法
(因为数组不会出现重复的,所以target肯定是一个不能被2整除的数,这样比之前要省暴力运算一点)
*/
import java.util.ArrayList;
class Solution {
public int[] twoSum(int[] nums, int target) {
// 新建两个数组用来对num进行排序和剪切
int num_1 []=new int[nums.length];
int num_2 []=new int [nums.length];
//创建一个新数组用来存储最后结果
int Fin[]=new int[2];
int num1_x=0;
int num2_y=0;
//对两个数组进行升序排序
Arrays.sort(num_1);
Arrays.sort(num_2);
//对这两个数组进行截取
//先从简单的出发,删去比target/2都大的值
// num_1.removeRange(getPlace(num_1,target/2),(num_1.length)-1);
//而截取从target/2 到target 需要进行两次,一次是从0—target/2 一次是从 target— length-1
//num_2.removeRange(0,getPlace(num_2,target/2)-1);
//num_2.removeRange(getPlace(num_2,target),num_2.length-1);
//截取不行,改用复制 Arrays.copyOfRange,先创建两个用来复制的数组
int num_11[]= Arrays.copyOfRange(num_1, 0, getPlace(num_1,target/2)-1);
if((getPlace(num_2,target/2))<= (getPlace(num_2,target))){
int num_22[]=Arrays.copyOfRange(num_2, getPlace(num_2,target/2), getPlace(num_2,target));
}
else{
int num_22[]=Arrays.copyOfRange(num_2, getPlace(num_2,target), getPlace(num_2,target/2));
}
//调用第二个函数
getNum(num_11,num_22,target,num1_x,num2_y);
//调用最后的结果
//show(num_11,num_22,num1_x,num2_y);
//调用最后结果
Fin[0]=getXia(nums,num1_x);
Fin[1]=getXia(nums,num2_y);
return Fin;
}
//先写一个方法用来得到最早出现比这个值大的下标
public int getPlace(int []x,int y){
int i=0;
for(i=0;i<x.length;i++){
if(x[i]>y)
break;
}
return i;
}
//在写一个方法用来暴力运算两个数组,找到这两个值。
public void getNum(int a[],int b[],int x,int num1_x,int num2_y){
num1_x=0;
num2_y=0;
for(int i=0;i<a.length;i++){
for(int j=0;j<b.length;j++){
if(a[i]+b[j]==x){
num1_x=a[i];
num2_y=b[j];
}
}
}
}
//写一个通过值获取下标的方法
public int getXia(int a[],int x){
int i=0;
for(i=0;i<a.length;i++){
if(a[i]==x)
break;
}
return i;
}
//再写一个方法,通过值知道坐标,用来显示最终结果
/* public void show(int a[],int b[],int num1_x,int num2_y){
int finally_num1=getXia(a,num1_x);
int finally_num2=getXia(b,num2_y);
System.out.println("["+finally_num1+","+finally_num2+"]");
}*/
//现在是需要写一个方法,确定两个值在数组中的下标,并用数组返回
/* public void getFin(int a[],int b[],int x,int y){ //分别是原数组,目标数组,值1,值2
int b[]=new int[2];
b[0]=getXia(a,x);
b[1]=getXia(a,y);
}*/
}
通过参考网上和自己领悟的
//思路就是 使用两个for循环,再创建一个新的数组用来存储位置。
class Solution {
public int[] twoSum(int[] nums, int target) {
int num_new[]=new int[2];//用来存储,只需要两位
for(int i=0;i<nums.length-1;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
num_new[0]=i;
num_new[1]=j;
//返回该数组
break;
}
}
}
return num_new;
}
}
但是依然成绩不是很理想,估计还是存在更加简便的算法。