1:TwoSum(如果两个和为某个数,找出这俩数的位置)

package leetcode;

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

/**
 * @author mercy
 *Example:
 *Given nums = [2, 7, 11, 15], target = 9,
 *Because nums[0] + nums[1] = 2 + 7 = 9,
 *return [0, 1].
 */
public class TwoSum {
	public static void main(String[] args) {
		int[] nums={2,0,4,9,5,7,10,9};
		int target=12;
		int[] arr=twoSum1(nums,target);
		System.out.println(arr[0]+"--"+arr[1]);
	}
	public static int[] twoSum(int[] nums, int target) {
		Map<Integer,Integer> map=new HashMap<>();
		for(int i=0;i<nums.length;i++){
			map.put(nums[i], i);
		}
		for(int i=0;i<nums.length;i++){
			int other=target-nums[i];
			if(map.containsKey(other)&&map.get(other)!=i){
				 return new int[] { i, map.get(other) };
			}
		}
		throw new IllegalArgumentException("No two sum solution");
    }
	/**
	 * @param nums
	 * @param target
	 * @return
	 * 用Map方法
	 * @author mercy
	 */
	public static int[] twoSum1(int[] nums, int target) {
		Map<Integer,Integer> map=new HashMap<>();
		for(int i=0;i<nums.length;i++){
			int other=target-nums[i];
			if(map.containsKey(other)){
				return new int[]{map.get(other),i};
			}
			map.put(nums[i], i);
		}
		throw new IllegalArgumentException("No two sum solution");
    }

	/**
	 * @param nums
	 * @param target
	 * @return
	 * 传统的方法
	 * @author mercy
	 */
	public static int[] twoSum2(int[] nums, int target) {
		for(int i=0;i<nums.length;i++){
			for(int j=i+1;j<nums.length;j++){
				if(nums[j]==target-nums[i]){
					return new int[] {i,j};
				}
			}
		}
		throw new IllegalArgumentException("No two sum solution");
    }

}
时间: 2024-10-29 13:24:36

1:TwoSum(如果两个和为某个数,找出这俩数的位置)的相关文章

一个整型数组里除了两个不同数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。

曾经做过一道水题找出除了一个数字之外,其他数字都有2个.直接异或 最后结果就是那个数. 现在变成存在2个不一样的数字,假设成x,y,那么可以O(n)求出x^y,因为x,y不同,所以异或的结果不为0,看成2进制数,那么找到第一位为1 的位置,将这个位置设置为划分点,数组里所有这个位置为1 的异或一次,所有为0的再异或一次,最终求出的两个即为两个独特的数字. #include <stdio.h> #include <string.h> #include <algorithm>

数据结构和算法设计专题之---判断两个链表是否相交并找出交点

题目: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点. 首先来看一下如何判断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的. 2.当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同. 3.第三种思路是比较奇特的,在编程之美上看到的.先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null).

逻辑题(一)一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。

package test; import java.util.*; public class test17 { public static void main(String[] args) { //一个整型数组里除了两个数字之外,其他的数字都出现了两次. // 请写程序找出这两个只出现一次的数字. int[] ints = {1,1,2,5,5,6,3,3}; Map<Integer, Integer> map = new HashMap<Integer, Integer>();

剑指Offer(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

/*一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. */ import java.util.*; public class Class45 { public void FindNumsAppearOnce(int[] array, int num1[], int num2[]){ ArrayList<Integer> list = new ArrayList<Integer>(); Arrays.sort(array); for(int

位运算 找出给定的数中其他数都是两个,有两个是一个的数

题目大意: 给定你n个数, 其中有n-2个数都是两两成对的,有两个是单独出现的,如n = 8, 2 3 2 5 3 6 4 6, 这时候4和5是单独的两个,所以答案就是4,5,其中n的范围是1e6. 思路: 之前做过找一个单独的数的题,那个题是用一个比较巧妙的方法来做的,不过这个也是一类经典问题,用到了强大的位运算,有了那个题的基础再来做这个题就简单了.(附:找一个的题目链接). 刚开始我是用了O(nlogn)的时间复杂度来做的,先排序,然后用类似找一个的方法找出第二个.我觉得对于1e6的数据量

数据结构和算法设计专题之---推断两个链表是否相交并找出交点

题目: 一个比較经典的问题,推断两个链表是否相交.假设相交找出他们的交点. 首先来看一下怎样推断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是採用hash来推断,将两个链表的节点进行hash.然后推断出节点,这样的想法当然是能够的. 2.当然採用暴力的方法也是能够的,遍历两个链表.在遍历的过程中进行比較,看节点是否同样. 3.第三种思路是比較奇特的,在编程之美上看到的. 先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null

一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)

粗糙的给出了分析,最近比较累,以后会改进的. 题目中包括三个小的问题,由简单到复杂: 1,如果只有一个出现一次,考察到异或的性质,就是如果同一个数字和自己异或的活结果为零,那么循环遍历一遍数组,将数组中的元素全部做异或运算,那么出现两次的数字全部异或掉了,得到的结果就是只出现一次的那个数字. 2,如果有两个只出现一次的数字,设定为a,b.也是应用异或,但是数组元素全部异或的结果x=a^b,因为a,b是不相同的数字,因此x肯定不为0.对于x,从低位到高位开始,找到第一个bit位为1的位置设定为第m

数据库资源消耗高时两条简单管用、快速找出可能问题原因的SQL语句

1.  查看正在执行的SQL语句 (1)SQL语句: selectdistinct s.sid,s.sql_id,s.event,s.program,s.MACHINE,q.sql_textfrom v$session s,v$sql q where s.sql_id=q.sql_idand s.status='ACTIVE'order by sql_text: (2)用途说明: 当数据库服务器负载高时,资源绝大部分的可能是被正在运行的SQL所消耗,查询到正在执行的SQL语句,是打开高消耗原因盒

找出两个整型数组中的公共元素的最大值

一,问题描述 给定两个整型数组,找出这两个数组中的最大的公共元素.注意条件:①公共元素   ②最大的公共元素 比如:arr1={8,2,9,6,18,7,25,28}   arr2={6,39,4,9,25,18,36,12}.假设 arr1 的长度为M,arr2的长度为N 这两个数组的最大公共元素是:25 二,思路 ①对 arr1 中的每个元素arr1[i],去 arr2 查找是否也存在 该元素,若存在则标记起来,因为它虽然是公共的,但不一定是最大的. 直到扫描完arr1中的所有元素,这种方式