领扣之两数之和

最初的想法(但是失败了,想的太过复杂,且太长了)

/*思路如下: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;
}
}

但是依然成绩不是很理想,估计还是存在更加简便的算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值