Leetcode:Two Sum分析和实现
问题表示提供一个整数数组nums,以及一个目标target,要找到两个下标i与j,使得nums[i] + nums[j] = target。
最简单的思路是两次循环:
for a in nums
for b in nums
if a + b = target then
return [a.index, b.index]
这样的代码的时间复杂度是O(n^2),其中n表示nums的长度。当n为1e4时,执行时间高达?e8,其中?是一个有上界的数值。
可以利用排序和二分查找优化这一过程:
sort(nums)
for a in nums
b = target - a
bIndex = binarySearch(nums, b)
if bIndex >= 0 then
return [a.index, bIndex]
这样代码的时间复杂度为排序时间复杂度+nx二分查找时间复杂度,这里采用归并排序来排序,因此结果为O(nlogn)+nxO(logn)=O(nlogn)。当n为1e4时,执行时间为?e5左右,其中?是一个有上界的数值。
最后贴上Java的完整实现代码给有需要的人:
package cn.dalt.leetcode; import java.util.Arrays; import java.util.Comparator; public class TwoSum { public static void main(String[] arg) { System.out.println(Arrays.toString( new TwoSum().twoSum(new int[]{3, 3}, 6) )); } static class Element { final int num; final int index; public Element(int num, int index) { this.num = num; this.index = index; } @Override public int hashCode() { return num; } @Override public boolean equals(Object obj) { return num == ((Element) obj).num; } } static final Comparator<Element> ELEMENT_COMPARATOR = new Comparator<Element>() { @Override public int compare(Element o1, Element o2) { return o1.num > o2.num ? 1 : o1.num < o2.num ? -1 : 0; } }; public int[] twoSum(int[] nums, int target) { Element[] elements = new Element[nums.length]; for (int i = 0, bound = nums.length; i < bound; i++) { elements[i] = new Element(nums[i], i); } //Sort the array with ascending order Arrays.sort(elements, ELEMENT_COMPARATOR); //Quickly find solution with binarysearch for (int i = 0, bound = elements.length; i < bound; i++) { Element a = elements[i]; Element b = new Element(target - a.num, -1); if (a.num == b.num) { if (i < elements.length - 1 && elements[i + 1].num == a.num) { return new int[]{a.index, elements[i + 1].index}; } } int bindex = Arrays.binarySearch(elements, b, ELEMENT_COMPARATOR); if (bindex >= 0) { return new int[]{a.index, elements[bindex].index}; } } return null; } }
Leetcode:Two Sum分析和实现的更多相关文章
- 剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers)
剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers) https://leetcode.com/problems/sum-of-two-in ...
- LeetCode:Path Sum I II
LeetCode:Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such ...
- [LeetCode] 907. Sum of Subarray Minimums 子数组最小值之和
Given an array of integers A, find the sum of min(B), where B ranges over every (contiguous) subarra ...
- [LeetCode] Path Sum III 二叉树的路径和之三
You are given a binary tree in which each node contains an integer value. Find the number of paths t ...
- [LeetCode] Combination Sum IV 组合之和之四
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- [LeetCode] Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K
Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...
- [LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- [LeetCode] Range Sum Query 2D - Immutable 二维区域和检索 - 不可变
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
随机推荐
- (八)js函数二
1.变量 a)局部变量:在所有函数内部定义的变量,或者在函数内部未使用var声明的变量也属于全局变量. b)全局变量:在所有函数外部定义的变量. eg: 1) var a = 5,b = 4, ...
- Ant入门之引用外部jar文件
笔者在java项目开发中经常遇到引用外部Jar包的情况,使用ant打包过程中需要对其引用.现在此简单记忆以飨来者. 此处引用Log4j,具体程序HelloLog4j.java: package oat ...
- 如何制作CDLinux启动盘
用笔记本安装虚拟机并且尝试使用CDLinux系统进行无线密码破解的朋友们可能会遇到很多的问题,今天的经验就是总结了很多的失败然后整理出来的,希望能够对大家有所帮助.本次经验来和大家分享一下使用U盘制作 ...
- oracle 删除当前用户下多个表
1.执行Sql语句: select 'drop table '||table_name||';' from cat where table_type='TABLE' 可查询到当前用户下所有的表,如图: ...
- CoreDNS kubernetes 安装使用
kubernetes 以前是skydns 后面变为 dnsmasq,coredns 也是一个不错的工具 1. 准备环境 安装 kubernetes 配置 kubelet 的cluster-dns 2 ...
- FastAdmin CMS 插件相关文章收集(2018-08-16)
FastAdmin CMS 插件相关文章收集(2018-08-16) CMS内容管理系统(含小程序) 介绍 https://www.fastadmin.net/store/cms.html CMS内容 ...
- Windows下查看什么进程占用文件
任务管理器→性能Tab→资源管理器→CPU→关联的句柄后面的检索框中录入文件名(关键文件夹即可). 比如我的是在删除tomcat下面的WEB-INF文件出现问题:就输入WEB-INF:mygod,发现 ...
- mongodb数据操作(CRUD)
1.数据插入db.集合名.insert() 操作 > use hk switched to db hk > show collections > db.info.insert({&q ...
- git问题记录
1.从远程仓库拉取A文件,在本地删掉了这个A文件,然后再去拉取远程仓库,是拉不下来的,因为本地版本库比远程库的高 我觉得是第一次远程的版本已经拉取了,本地已记录,远程程没有发生变化,在拉取和先前的一致 ...
- Java-Runoob:Java switch case
ylbtech-Java-Runoob:Java switch case 1.返回顶部 1. Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等 ...