Two Sum

刚开始刷leetcode,总结一下来备忘

第一道题,也不是很难,题目如下:

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, and you may not use the same element twice.

For example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

这道题的题目意思从给的例子中也很容易看出来,就是给了一个数组nums,和一个目标值target,返回nums中的两个相加等于target的元素的下标数组,首先在最后提交的测试用例中,nums这个数组中的元素不一定是和例子一样按照从小到大的顺序排列的,其次在题目中已经假设了每一组input都有且仅有一组解,这样也就不用考虑没有或者有多组解的情况,明确了这两点,一下可以想到的就是一个复杂度是O(n^2)的解法,下面提供了C++和javascript两种写法。

1)C++写法

 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& nums, int target) {
 4         for(int i=0;i<nums.size();i++){
 5             for(int j=i+1;j<nums.size();j++){
 6                 if(nums[i]+nums[j]==target){
 7                     vector<int> result(2);
 8                     result[0]=i;
 9                     result[1]=j;
10                     return result;
11                 }
12             }
13         }
14     }
15 };

2)javascript写法

1 var twoSum = function(nums, target) {
2     for(var i=0;i<nums.length;i++){
3         for(var j=i+1;j<nums.length;j++){
4             if(nums[i]+nums[j]==target){
5                 return [i,j];
6             }
7         }
8     }
9 };

这两种方法提交也都通过了,不过肯定不是最优解,看到别人的最优解法的复杂度是O(n),使用哈希表存储nums数组和target之间的差距,在访问nums数组的时候都首先查找当前访问的数组元素是不是和hash_table中的某一个键相等,若不相等,则把该差距作为hash_table的键,把当前访问元素的下标作为对应的值,存在hash_table中,若相等,取出该键对应的值和当前访问的下标一起返回即可。

1)在C++中实现hash_table我是用了map类库实现,代码如下:

 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& nums, int target) {
 4         vector<int> result;
 5         map<int,int> map_container;
 6         for(int i=0;i<nums.size();i++){
 7             map<int,int>::iterator it=map_container.find(nums[i]);
 8             if(it == map_container.end()){
 9                 map_container[target-nums[i]]=i;
10             }
11             else{
12                 result.push_back(it->second);
13                 result.push_back(i);
14                 return result;
15             }
16         }
17     }
18 };

2)在javascript中直接使用object构造键值对实现hash_table即可,代码如下:

 1 var twoSum = function(nums, target) {
 2     var map_container={};
 3     for(var i=0;i<nums.length;i++){
 4         if(nums[i] in map_container){
 5             return [map_container[nums[i]],i];
 6         }
 7         else{
 8             map_container[target-nums[i]]=i;
 9         }
10     }
12 };

总结使用到的有关C++的知识点:

1)关于vector

初始化:vector<type> a(init_size)    type:表示vector中的元素类型,init_size也可以省略,如果显示则表示初始化vector的大小

动态增加元素:使用方法push_back(),即在原来的vector末尾附加新元素。

遍历vector:两种方法都可以,使用size()方法返回vector的大小然后用下标访问的方法即可,或者使用遍历器遍历vector<type>::iterator it,it的本质是一个指针,所以(*it)就表示当前it指针所指vector位置的元素的值,当然上面那道题适合的方法是下标访问的方法。

2)关于map

初始化:map<key_type,value_type> map_container  key_type:表示map中的键的元素的类型,value_type:表示map中的值的元素类型。

插入键值对:直接用map_container[key]=value的形式插入即可

判断一个键是否存在:使用find()和遍历器实现,find()函数找到要查找的键返回该键所在的位置指针,没找到返回end(),所以只需要判断是否是最后一个迭代器就知道是否存在查找的键。

访问某一个键值对:使用map_container[key]得到对应的value,或者使用map<type,type>::iterator it遍历器,it作为指针支持,it->first返回键,it->second返回值。

总结javascript中用到的知识点:

主要就是使用object键值对来构造哈希表:

1)使用对象初始化,map_container={}

添加新的键值对直接使用点操作符,或者当键可能引起操作错误的时候使用方括号来插入,如map_container[key]=value,map_container.key=value

判断一个键是否能存在:使用key in map_container,返回true表示存在,否则返回false。

2)强调注意

访问对象属性的方法有两个,一个是使用点操作符一个是使用方括号来访问,这两个方法在大多数情况下没有什么差别,但是如果访问的属性是一个变量的时候,则应该使用方括号来访问,还有就是一些属性名中包含会导致语法错误的字符,或者属性名使用的是关键字或保留字,这时候也要使用方括号来访问,使用点操作符会导致语法错误,总结来说就是键是数字,或者带有空格,或者把键的值赋给一个变量来访问的时候,就应该使用方括号来访问。

时间: 2024-11-07 12:04:26

Two Sum的相关文章

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

129. Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

31.SUM() 函数

SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM(column_name) FROM table_name SQL SUM() 实例 我们拥有下面这个 "Orders" 表: O_Id OrderDate OrderPrice Customer 1 2008/12/29 1000 Bush 2 2008/11/23 1600 Carter 3 2008/10/05 700 Bush 4 2008/09/28 300 Bush 5

1305 Pairwise Sum and Divide

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor((A[i]+A[j])/(A[i]*A[j])) return sum 给出数组A,由你来计算fun(A)的结果.例如:A = {1, 4, 1},fun(A) = [5/4] + [

Java [Leetcode 303]Range Sum Query - Immutable

题目描述: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3 Note: You may assume that the ar

LeetCode 303. Range Sum Query - Immutable

求数组nums[i,j]的和 思路:另开一sum数组,sum[i]为nums[0,i]的和,所以nums[i,j] = sum[j] - sum[i-1] 1 class NumArray { 2 public: 3 vector<int> sum; 4 NumArray(vector<int> &nums) { 5 sum.resize(nums.size(), 0); 6 sum[0] = nums[0]; 7 int len = nums.size(); 8 for(

【数组】Minimum Path Sum

题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 思路: 设res[i][j]表示从左上角到grid[i][

HDU 5586 Sum

最大子串和 #include<cstdio> #include<cstring> const int maxn=100000+10; int n; int x[maxn]; int fx[maxn]; int a[maxn]; int sum[maxn]; int L[maxn],R[maxn]; const int INF=0x7FFFFFFF; int max(int a,int b) { if(a>b) return a; return b; } int main()

leetcode笔记:Combination Sum III

一. 题目描述 Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers. Ensure that numbers within the set are sorted in ascending order. E