No.001:Two Sum

问题:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

难度:

Easy

翻译:

给定一个整型数组和一个特殊值,返回数组中两数的下标,这两数的和为给定的特殊值,假定解唯一确定。

例子:

给定数组{2,7,11,15},特殊值9,返回下标[0,1]

思路:

1. 解唯一确定,是一个很重要的信息,将数组转为集合,利用集合的List.contains()方法,当前值a和sum-a都在集合中

解题中遇到的困难:

1. 数组转集合,容易出现如下错误:

1 int[] array = new int[length];
2 List<Integer> list = new ArrayList<>();
3 list = Arrays.asList(array);

这种情况下,编译器会报错,提示将第2行的List<Integer>转为List<int[]>。原因在于集合不会接收基本类型,而这种情况不会触发自动装箱,所以集合将int[]作为集合接收的类型。

2. 使用Arrays.asList(array)生成的集合,拥有不可使用add()和remove()一系列方法的特性,一旦使用,会抛出java.lang.UnsupportedOperationException,而且是运行时异常,编译器不会报错。

解题代码:

private static int[] method(int[] array, int sum) {
        // 结果数组
        int[] result = new int[2];
        // 保护无结果的标志位
        boolean flag = false;
        // 先将int[]转成Integer[]
        Integer[] collectionArray = new Integer[array.length];
        for (int i = 0; i < array.length; i++) {
            collectionArray[i] = array[i];
        }
        List<Integer> list = new ArrayList<>();
        list = Arrays.asList(collectionArray);
        list.remove(0);
        for (Integer a : list) {
            if (list.contains(sum - a)) {
                result[0] = list.indexOf(a);
                result[1] = list.lastIndexOf(sum - a);
                flag = true;
                break;
            }
        }
        if (flag) {
            return result;
        }
        return null;
    }

测试代码地址:

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/easy/Q001.java

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

时间: 2024-10-13 11:41:39

No.001:Two Sum的相关文章

通过位运算求两个数的和(求解leetcode:371. Sum of Two Integers)

昨天在leetcode做题的时候做到了371,原题是这样的: 371. Sum of Two Integers Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 因为之前完全没有在实际练习中使用过位运算,所以刚看到这道题目的时候我的第一反应是 1.用乘除代替加减,但是一想,

leetcoder系列001:c++字符串反转

问题: 给定一个输入字符串,字符串字反向词.例如 s = "the sky is blue",返回 "blue is sky the". 我的答案: class Solution { public: void reverseWords(string &s) { if(s.size() <= 0) return; string pattern = " "; string::size_type pos; vector<string

JavaScript提高:001:ASP.NET使用easy UI

jQuery EasyUI是一组基于jQuery的UI插件集合.可以简洁的开发出功能多内容丰富的界面,而不需要开发者自己费力的写那些复杂的js代码.本文简单介绍在ASP.NET开发中引用这些js文件和样式.下面看下需要引用的基本常用的easyui文件.文件下载网上比较多,可以直接搜索下载.一些常用的文件如下图所示 在asp.net页面引用如下: 引用样式和文件 <link href="Scripts/EasyUI/themes/icon.css" rel="styles

每日算法之三十一:Combination Sum

给定一个整数序列,求解一个子序列,子序列之和等于给定目标值.子序列满足以下条件: 1)子序列是有序的 2)子序列的元素个数不限,可以是给定元素的重复元素. 3)结果中的子序列是唯一的 原题描述如下: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T. The same repeat

HDU1244:Max Sum Plus Plus Plus

题目链接:Max Sum Plus Plus Plus 题意:在n个数中取m段数使得这m段数之和最大,段与段之间不能重叠 分析:见代码 //dp[i][j]表示前i个数取了j段的最大值 //状态转移:dp[i][j]=max(dp[k][j-1]+(sum[k+l[j]-sum[k]或者sum[i]-sum[i-l[j]) (0<=k<=i-l[j]) // 这种做法是O(n^2)的 //如果改成O(n)的呢? //需要加一个数组max_dp[i][j]表示前i个数取j段的dp最大值 //如果

LeetCode1:Two Sum

题目: Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note t

安卓纪事-001:Missing emulator engine program for &#39;arm&#39; CPUS.的解决方法

今天晚上调试的时候竟然无法打开安卓模拟器,还给出了一个错误提示:Missing emulator engine program for 'arm' CPUS. 上网搜了很久,竟然没有发现有和我同样问题的人,无奈中在外网搜了下,果然找到了牛人的解决方法,这个问题应该是你的病毒软件把你的emulator-arm.exe这个文件隔离了,在启动模拟器的时候就找不到这个文件,自然无法启动了,解决方法也很简单,在其它sdk的tools文件夹里面复制一个emulator-arm.exe这个文件到你现在使用的s

001:判断闰年

输入一个年份,判断是否为闰年. 判断闰年的方法是:如果该年能被4整除但不能被100整除:或者能被400整除,就是闰年. 1 #include <stdio.h> 2 3 int main( int argc, char* argv[] ) 4 { 5 6 unsigned long year; 7 8 printf("Input a year:"); 9 scanf("%lu", &year); 10 if((year % 4 == 0 &

ORACLE—001:Alter之增加字段,修改字段类型

--积累工作中用到的SQL 1.增加和删除一列 写法: --增加一列      alter table  表名 add  列名 类型;      --删除一列      alter table  表名 drop column 列名 ; 例如: --增加一列      alter table  TB_TEMP add  COL_ID  VARCHAR2(40);      --删除一列      alter table TB_TEMP  drop column COL_ID  ; 2.修改列的类型