【leetcode】两数之和
https://leetcode.com/problems/two-sum/
Example:
- Given nums = [2, 7, 11, 15], target = 9,
- Because nums[0] + nums[1] = 2 + 7 = 9,
- return [0, 1].
Java:
版本1,暴力搜索(减少了部分搜索),预计打败全世界30%的答案。
- public int[] twoSum(int[] nums, int target) {
- int size = nums.length;
- int size2 = size - 1;
- for (int i=0; i<size2; i++) {
- for (int j=i+1; j<size; j++) {
- if ((nums[i] + nums[j]) == target) {
- int[] pair = new int[2];
- pair[0] = i;
- pair[1] = j;
- return pair;
- }
- }
- }
- int[] pair = new int[2];
- return pair;
- }
版本2,,通过HashMap解决循环匹配问题,预计打败全世界50%
- HashMap<Integer, Integer> mm = new HashMap<Integer, Integer>();
- int size = nums.length;
- for (int i=0; i<size; i++) {
- mm.put(nums[i], i);
- }
- Integer tmp = 0;
- Integer v= 0;
- for (int i=0; i<size; i++) {
- tmp= target - nums[i];
- v = mm.get(tmp);
- if (v != null && v.intValue()!=i) {
- int[] pair = new int[2];
- pair[0] = i;
- pair[1] = v;
- return pair;
- }
- }
- int[] pair = new int[2];
- return pair;
版本3, 写到版本2的时候,肯定会想到把循环合并到一起执行,预计打败全世界58%。
- HashMap<Integer, Integer> mm = new HashMap<Integer, Integer>();
- int size = nums.length;
- Integer tmp = 0;
- Integer v= 0;
- mm.put(nums[0], 0);
- for (int i=1; i<size; i++) {
- tmp= target - nums[i];
- v = mm.get(tmp);
- if (v != null) {
- int[] pair = new int[2];
- pair[0] = i;
- pair[1] = v;
- return pair;
- }
- mm.put(nums[i], i);
- }
- int[] pair = new int[2];
- return pair;
版本4. 上面的代码已经不知道怎么优化,那么就减少int和Integer的转换吧,自己定制了一个IntHashMap,开始打败了68%,后面优化了hash的处理,提升到79%。
- static final int MISSIDX = -1;
- public int[] twoSum(int[] nums, int target) {
- IntHashMap mm = new IntHashMap();
- int size = nums.length;
- int tmp = 0;
- int v = 0;
- mm.put(nums[0], 0);
- for (int i = 1; i < size; i++) {
- tmp = target - nums[i];
- v = mm.get(tmp);
- if (v != MISSIDX) {
- int[] pair = new int[2];
- if (tmp == nums[i]) {
- pair[0] = v;
- pair[1] = i;
- } else {
- pair[0] = i;
- pair[1] = v;
- }
- return pair;
- }
- mm.put(nums[i], i);
- }
- int[] pair = new int[2];
- return pair;
- }
- static class IntHashMap {
- public static final int DEFAULT_INITIAL_CAPACITY = 16;
- public static final int MAXIMUM_CAPACITY = 1073741824;
- public static final float DEFAULT_LOAD_FACTOR = 0.75F;
- private transient IntEntry[] table;
- private transient int size;
- private int threshold;
- private final float loadFactor;
- public IntHashMap(int initialCapacity) {
- this.loadFactor = 0.75F;
- int capacity = 1;
- while (capacity < initialCapacity) {
- capacity <<= 1;
- }
- this.threshold = ((int)(capacity * loadFactor));
- this.table = new IntEntry[capacity];
- }
- public IntHashMap() {
- this.loadFactor = 0.75F;
- this.threshold = 12;
- this.table = new IntEntry[16];
- }
- protected int indexFor(int key, int length) {
- return key & length - 1;
- }
- public int get(int key) {
- int i = indexFor(key, this.table.length);
- IntEntry e = this.table[i];
- while (true) {
- if (e == null)
- return MISSIDX;
- if (e.key == key)
- return e.value;
- e = e.next;
- }
- }
- public void put(int key, int value) {
- int i = indexFor(key, this.table.length);
- addEntry(key, value, i);
- }
- private void addEntry(int key, int value, int bucketIndex) {
- IntEntry e = this.table[bucketIndex];
- this.table[bucketIndex] = new IntEntry(key, value, e);
- if (this.size++ >= this.threshold)
- resize(2 * this.table.length);
- }
- protected void resize(int newCapacity) {
- IntEntry[] oldTable = this.table;
- int oldCapacity = oldTable.length;
- if (oldCapacity == 1073741824) {
- this.threshold = 2147483647;
- return;
- }
- IntEntry[] newTable = new IntEntry[newCapacity];
- transfer(newTable);
- this.table = newTable;
- this.threshold = ((int) (newCapacity * this.loadFactor));
- }
- private void transfer(IntEntry[] newTable) {
- IntEntry[] src = this.table;
- int newCapacity = newTable.length;
- for (int j = 0; j < src.length; j++) {
- IntEntry e = src[j];
- if (e != null) {
- src[j] = null;
- do {
- IntEntry next = e.next;
- int i = indexFor(e.key, newCapacity);
- e.next = newTable[i];
- newTable[i] = e;
- e = next;
- } while (e != null);
- }
- }
- }
- public String toString() {
- return Arrays.deepToString(this.table);
- }
- }
- static class IntEntry {
- protected final int key;
- protected int value;
- protected IntEntry next;
- protected IntEntry(int k, int v, IntEntry n) {
- this.value = v;
- this.next = n;
- this.key = k;
- }
- public int getKey() {
- return this.key;
- }
- public int getValue() {
- return this.value;
- }
- public void setValue(int newValue) {
- this.value = newValue;
- }
- public boolean equals(Object o) {
- if (!(o instanceof IntEntry))
- return false;
- IntEntry e = (IntEntry) o;
- int eKey = e.getKey();
- int eVal = e.getValue();
- if (eKey == getKey()) {
- return eVal == MISSIDX ? false : getValue() == MISSIDX ? true
- : eVal == getValue();
- }
- return false;
- }
- public int hashCode() {
- return this.key ^ (this.value == MISSIDX ? 0 : value);
- }
- public String toString() {
- return "[" + key + "," + value + "]";
- }
- }
版本5. hashMap这个方向看来是尽头了,那用稀疏数组吧,貌似打败了87.62%
- static final int MISSIDX = -1;
- public int[] twoSum_0_4(int[] nums, int target) {
- SparseIntArray mm = new SparseIntArray();
- int size = nums.length;
- int tmp = 0;
- int v = 0;
- mm.put(nums[0], 0);
- for (int i = 1; i < size; i++) {
- tmp = target - nums[i];
- v = mm.get(tmp);
- if (v != MISSIDX) {
- int[] pair = new int[2];
- if (tmp == nums[i]) {
- pair[0] = v;
- pair[1] = i;
- } else {
- pair[0] = i;
- pair[1] = v;
- }
- return pair;
- }
- mm.put(nums[i], i);
- }
- int[] pair = new int[2];
- return pair;
- }
- static final int[] EMPTY_INTS = new int[0];
- static int idealByteArraySize(int need) {
- for (int i = 4; i < 32; i++)
- if (need <= (1 << i) - 12)
- return (1 << i) - 12;
- return need;
- }
- static int idealIntArraySize(int need) {
- return idealByteArraySize(need * 4) / 4;
- }
- static int binarySearch(int[] array, int size, int value) {
- int lo = 0;
- int hi = size - 1;
- while (lo <= hi) {
- final int mid = (lo + hi) >>> 1;
- final int midVal = array[mid];
- if (midVal < value) {
- lo = mid + 1;
- } else if (midVal > value) {
- hi = mid - 1;
- } else {
- return mid; // value found
- }
- }
- return ~lo; // value not present
- }
- static class SparseIntArray {
- private int[] mKeys;
- private int[] mValues;
- private int mSize;
- public SparseIntArray() {
- this(10);
- }
- public SparseIntArray(int initialCapacity) {
- initialCapacity = idealIntArraySize(initialCapacity);
- mKeys = new int[initialCapacity];
- mValues = new int[initialCapacity];
- mSize = 0;
- }
- public int get(int key) {
- return get(key, MISSIDX);
- }
- public int get(int key, int valueIfKeyNotFound) {
- int i = binarySearch(mKeys, mSize, key);
- if (i < 0) {
- return valueIfKeyNotFound;
- } else {
- return mValues[i];
- }
- }
- public void put(int key, int value) {
- int i = binarySearch(mKeys, mSize, key);
- if (i >= 0) {
- mValues[i] = value;
- } else {
- i = ~i;
- if (mSize >= mKeys.length) {
- int n = idealIntArraySize(mSize + 1);
- int[] nkeys = new int[n];
- int[] nvalues = new int[n];
- System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
- System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
- mKeys = nkeys;
- mValues = nvalues;
- }
- if (mSize - i != 0) {
- System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i);
- System.arraycopy(mValues, i, mValues, i + 1, mSize - i);
- }
- mKeys[i] = key;
- mValues[i] = value;
- mSize++;
- }
- }
- public String toString() {
- if (mSize <= 0) {
- return "{}";
- }
- StringBuilder buffer = new StringBuilder(mSize * 28);
- buffer.append('{');
- for (int i=0; i<mSize; i++) {
- if (i > 0) {
- buffer.append(", ");
- }
- int key = mKeys[i];
- buffer.append(key);
- buffer.append('=');
- int value = mValues[i];
- buffer.append(value);
- }
- buffer.append('}');
- return buffer.toString();
- }
- }
【leetcode】两数之和的更多相关文章
- 【数据结构】Hash表简介及leetcode两数之和python实现
文章目录 Hash表简介 基本思想 建立步骤 问题 Hash表实现 Hash函数构造 冲突处理方法 leetcode两数之和python实现 题目描述 基于Hash思想的实现 Hash表简介 基本思想 ...
- LeetCode两数之和
LeetCode 两数之和 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是 ...
- leetcode两数之和go语言
两数之和(Go语言) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复 ...
- leetcode 两数之和 python
两数之和 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 1 ...
- leetcode - 两数之和Ⅳ 输入BST(653)
题目描述:给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 解题思路:根据二叉搜索树的特点,对二叉搜索树进行中序遍历可以得到一个从小到达排 ...
- Leetcode -- 两数之和Ⅰ
1. 两数之和 题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 示例:给定 nums = [2, 7, 11, 15 ...
- leetcode 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...
- Leetcode 两数之和 (散列表)
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- LeetCode两数之和-Python<一>
下一篇:LeetCode链表相加-Python<二> 题目:https://leetcode-cn.com/problems/two-sum/description/ 给定一个整数数组和一 ...
- leetCode:twoSum 两数之和 【JAVA实现】
LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...
随机推荐
- PHP日期与时间
时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数.它也被称为 Unix 时间戳(Unix Timestamp).Unix时间戳(Unix timestamp),或称Uni ...
- Python爬虫Scrapy框架入门(2)
本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西 附上原创链接: http://www.cnblogs.com/qiyeboy/p/5428240.html 基本思路是,查看网页元素,填写 ...
- iOS APP提交上架最新流程(转)
时隔1年又让我鼓捣iOS,刚接手就是上架,经验值为0的我,虽然内心是拒绝的,但还是要接受这项任务滴!也就是在被拒后重新审核,再改在提交...这样 反复的过程中也对上架流程熟悉了好多,写篇帖子送给同为菜 ...
- UWP 禁止Pivot swip 手势
以前想要禁止内置的手势动作,看了一下网上是设置 IsLocked="True". 但是拿到UWP上来,靠,设置了之后header只显示当前的那个header.这样的设计真是丑爆了. ...
- 【tomcat ecplise】新下载一个tomcat,无法成功启动,或者启动了无法访问localhost:8080页面/ecplise无法添加新的tomcat/ecplise启动tomcat启动不起来
今天转头使用ecplise,于是新下载一个tomcat7来作为服务器使用 但是问题来了: [问题1:全新的tomcat启动即消耗了不可思议的时间,并且启动了之前其他tomcat中的很多项目] [注意: ...
- 互联网+下PDA移动智能手持POS超市收银开单软件
是一套专为中小超市.专卖店设计的收银管理软件,广泛应用于中小超市(百货商店).化妆品店.婴幼儿用品店.玩具店.保健品店.茶叶店. 电器.文具图书.手机通讯器材店等行业的中小型店面店铺.该系统具有完善的 ...
- 转-临界区对象TCriticalSection与TRTLCriticalSection的区别
TRTLCriticalSection是一个结构体,在windows单元中定义: 是InitializeCriticalSection, EnterCriticalSection, LeaveCrit ...
- Android之UI编程(一):线性布局
package com.example.fk_layout; import android.app.Activity; import android.os.Bundle; public class L ...
- C#-ASP.NET MVC-架构【1】-自定义错误页
自定义异常本来是一件很简单的事情,没想到在做的过程中遇到各种坑,目前来说,还有Session过期和Ajax请求这两种情况没有特殊处理,其他的基本已经可以使用,等慢慢完善吧. 一.在web.config ...
- MD5 、 加密工具
package com.cgcyiliao.server.util; import java.security.MessageDigest; import java.security.NoSuchAl ...