leetcode:两数之和

力扣1:
给定一个升序排列的整数数组 numbers ,从数组中找出两个数满足相加之和等于目标数 target
假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。
返回两数的下标值,以数组形式返回
package com.lz;

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

public class sum {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(Arrays.toString(solution(new int[] {1,2,3,4,5,6},10)));
		System.out.println(Arrays.toString(solution1(new int[] {1,2,3,4,5,6},10)));
		System.out.println(Arrays.toString(twoSearch(new int[] {1,2,3,4,5,6},10)));
		System.out.println(Arrays.toString(twoPoint(new int[] {1,2,3,4,5,6},10)));
	}

	//暴力解法
	public static int[] solution(int[] nums,int target) {
		for(int i=0;i<nums.length;i++) {
			for(int j=i+1;j<nums.length;j++) {
				if(nums[i]+nums[j]==target) {
					return new int[] {i,j};
				}
			}
		}
		return new int[] {0};
	}
	
	//哈希表:将数组的值作为key存入map,target - num作为key
	public static int[] solution1(int[] nums,int target) {
		Map<Integer,Integer> map=new HashMap<Integer,Integer>();
		for(int i=0;i<nums.length;i++) {
			if(map.containsKey(target-nums[i])) {
				return new int[] {map.get(target-nums[i]),i};
			}
			map.put(nums[i],i);
		}
		return new int[] {0};
	}
	
	//二分查找
	public static int[] twoSearch(int[] nums,int target) {
		for(int i=0;i<nums.length;i++) {
			int low=i,high=nums.length-1;
			while(low<=high) {
				int mid=low+(high-low)/2;
				if(nums[mid]==target-nums[i]) {
					return new int[] {i,mid};
				}else if(nums[mid]>target-nums[i]) {
					high=mid-1;
				}else {
					low=mid+1;
				}
			}
		}
		return new int[] {0};
	}
	
	//双指针
	public static int[] twoPoint(int[] nums,int target) {
		int low=0,high=nums.length-1;
		while(low<high) {
			int sum=nums[low]+nums[high];
			if(sum==target) {
				return new int[] {low,high};
			}else if(sum>target) {
				high--;
			}else {
				low++;
			}
		}
		return new int[] {0};
	}
	
	
}

另:

package com.lz.forth;
 
import java.util.HashMap;
import java.util.Map;
 
public class TwoSum {
 
 
    public static void main(String[] args) {
        int[] nums={4,6,13,8,7,9,1};
        int[] result=new TwoSum().fastWithMap(nums,20);
        for(int e:result){
            System.out.print(nums[e]+" ");
        }
        System.out.println();
        int[] nums2={3,2,4};
        int[] result2=new TwoSum().fastWithMap2(nums2,6);
        for(int e:result2){
            System.out.print(nums2[e]+" ");
        }
    }
 
	
    /*暴力穷举,复杂度O(n^2)*/
    public int[] normal(int[] nums,int target) {
        int[] result=new int[2];
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]+nums[j]==target) {
                    result[0]=i;
                    result[1]=j;
                    return result;
                }
            }
        }
        return result;
    }
 
    /*用一个哈希表,存储每个数对应的下标,时间复杂度是O(n)*/
    public int[] fastWithMap(int[] nums,int target) {
        /*key为元素值,value为每个元素对应的下标*/
        Map<Integer,Integer> storeNums=new HashMap<>();
        int[] result=new int[2];
        for(int i=0;i<nums.length;i++){
            int another=target-nums[i];
            Integer anotherIndex=storeNums.get(another);
            if(anotherIndex!=null){
                result[0]=anotherIndex ;
                result[1]=i;
                break;
            }else{
                storeNums.put(nums[i],i);
            }
        }
        return result;
    }
 
    /*用一个哈希表,存储每个数对应的下标,时间复杂度是O(n)*/
    public int[] fastWithMap2(int[] nums, int target) {
        HashMap<Integer,Integer> map = new HashMap<>();
        int[] result=new int[2];
        for (int i=0;i<nums.length;i++) {
            if(map.containsKey(nums[i])) {
                int anotherIndex=map.get(nums[i]);
                result[0]=anotherIndex ;
                result[1]=i;
                break;
            }else {
                map.put(target-nums[i],i);
            }
        }
        return result;
    }
 
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值