leetcode---数组

leetcode 数组 两数之和
题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

示例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

package TwoSum;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: 何未了
 * @Date: 2020/05/28/8:20
 * @Description:
 */
public class exercise {
    public static void main(String[] args) {
        int[] arr = {2,7,11,9};
        int target = 9 ;
        int[] result1 = twosum1(arr , target);
        int[] result2 = tosum2(arr , target);
        int[] result3 = tosum3(arr , target);
        System.out.println(Arrays.toString(result2));
        System.out.println(Arrays.toString(result2));
        System.out.println(Arrays.toString(result3));



    }
    /**
     * 解法一 暴力解法
    遍历数组中的每个元素,返回两数的下标
    两次for循环 时间复杂度是O(n^2)   空间复杂度O(1)
    * @Date: 2020/5/28
    */ 

    public static int[] twosum1(int[] arr , int target){
        for(int i = 0 ; i < arr.length ; i++){
            for(int j = i+1 ; j < arr.length ; j++){
                if(arr[i] + arr[j] == target){
                    return new int[] {i,j};
                }
            }
        }
        throw new IllegalArgumentException("cannot find such number");
    }

    /****
     解法二 两遍哈希表
     通过空间换时间
     遍历了两遍含有n个元素的哈希表,查找时间是O(1) 
     时间复杂度是O(n) 空间复杂度是O(n)
     第一建立一个哈希表 在哈希表中 存入 数组元素 和 相对应的数组下标
     第二遍历哈希表     在哈希表中 寻找 targrt-arr[i] 若存在,则返回
    * @Date: 2020/5/28
    */

    public static int[] tosum2(int[] arr , int targrt){
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0 ; i < arr.length ; i++){
            map.put(arr[i] , i) ;
        }
        for(int i = 0 ; i < arr.length ; i++){
            int another = targrt - arr[i] ;
            //如果哈希表中存在目标值( target-arr[i] ),并且这个值不是 不是arr[i] 本身
            if(map.containsKey(another) && map.get(another) != i)
                return new int[] {i,map.get(another)};
        }
        throw new IllegalArgumentException("can not find such number");
    }

    /*
    解法三 一遍哈希表
     遍历了一遍含有n个元素的哈希表,查找时间是O(1) 
     时间复杂度是O(n) 空间复杂度是O(n)
     解法二中的两遍哈希表,第一次仅仅是存储值和索引,第二次才是查找目标值
     现在将两步合并成为一步 直接将目标值(target-arr[i])进行存储
     nums = [2,7,11,15]  target = 26

     target-arr[i]   26-2=24(不存在)  26-7=19(不) 26-11=15(不)  26-11=15(已存在) 此时返回11的索引 2 和arr[i]的 i值
         key            2                 7             11
        value           0                 1             2

    * @Date: 2020/5/28
    */
    public static int[] tosum3(int[] arr , int target){
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0 ; i < arr.length ; i++){
            int another = target - arr[i] ;
            if(!map.containsKey(another))
                map.put(arr[i],i);
            else
                return new int[]{map.get(another),i};
        }
     throw new IllegalArgumentException("can not find such number");
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值