两数之和(无序)3 有序 167

两数之和(无序)3

 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 
 两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。
 但是,数组中同一个元素在答案里不能重复出现。

1、暴力

  • 之前那个i、j从两头搜的方法,是针对有序数组的,所以不行,这个就是从头两个指针,一次遍历就好了
  • 新建数组:int[] index=new int[2];
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int size=nums.length;
        int[] index=new int[2];// int[]就是new的类型;
        for(int i=0;i<size-1;i++){//i不取最后一个数字
            for(int j=i+1;j<size;j++){
                if(nums[i]+nums[j]==target){
                    index[0]=i;
                    index[1]=j;
                    return index;
                }
            }
        }
        return index;        
    }
}

2、空间换时间 (低复杂度)

在这里插入图片描述

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer>map=new HashMap<Integer,Integer>();
        int len=nums.length;
        for(int i=0;i<len;i++){
            //键对值,键nums[i],对 i
            if(map.containsKey(target-nums[i])){
                //返回具体下标,即返回num[i]的下标i
                //target - nums[i]的下标map.get(target - nums[i])
                return new int[]{map.get(target - nums[i]), i};
                //return new int[]{nums[i],target-nums[i]};这个是返回的具体的值
            }
            map.put(nums[i],i);
        }
        return new int[]{-1,-1};

    }
}

有序数组找特定值 167

给定一个已按照 非递减顺序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于
目标数 target 。你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
  • 新建值为{-1,-1}的数组操作:new int[]{-1, -1};
  • 给数组添加元素index[0]=i+1;不是add
  • 下标是从1开始的
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int size=numbers.length;
        if(size==0){
            return new int[]{-1,-1};
        }
        int i=0;
        int j=size-1;
        int[] index=new int[2];
        while(i<j){
            if(numbers[i]+numbers[j]==target){
                index[0]=i+1;
                index[1]=j+1;
                return index;//return new int[]{-1,-1};
            }
            else if(numbers[i]+numbers[j]<target){
                i++;
            }
            else if(numbers[i]+numbers[j]>target){
                j--;
            }
        }
        return index;// return new int[]{-1,-1};
    }
}

返回数组里的数字

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int size=nums.length;
        int i=0,j=size-1;
        while(i<j){
            if(nums[i]+nums[j]==target){
                return new int[]{nums[i],nums[j]};
            }
            while(nums[i]+nums[j]>target){
                j--;
            }
            while(nums[i]+nums[j]<target){
                i++;
            }
        }
        return new int[]{};
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值