感觉有必要重新刷刷题了,为以后找工作做做准备,选择LeetCode+topcoder上的Data Science Tutorials,

争取每天晚上10:00开始刷一道,复习一下相关知识点。

-------------------------------------------------------分割线啦-----------------------------------------------------------------------

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 that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

【题意】:这题意思就是给定一些数,再给你一个目标数字,让你在给定的那些数字中找出两个数,这两个数的和等于目标数字。注意给定的这些数字是无序的。

【心路历程】:看到这题,简单想了想,就知道O(n*2)的遍历一定会超时。于是进一步的思考,感觉特别像hash,可是懒得实现hash。。。

就开始想想还有没有别的方法。感觉这种无序的数字,排序后都会比较好处理一点。就开始往排序上想,发现排好序后确实比较好处理。

我们用两个下标,一个指向开始beg,一个指向末尾end,我们去比较target减去beg指向的数字,与end指向的数字。如果target-beg == end ,就找到了;

如果 target-beg > end ,就beg++;如果target-beg < end ,就end--。这样的话,时间复杂度是O(n*logn)。我感觉差不多可以接受,就交了,ac。

为了学习知识,ac不是目的,我看了一下官方解法:

O(n2) runtime, O(1) space – Brute force:

The brute force approach is simple. Loop through each element x and find if there is another value that equals to target – x.

As finding another value requires looping through the rest of array, its runtime complexity is O(n2).

O(n) runtime, O(n) space – Hash table:

We could reduce the runtime complexity of looking up a value to O(1) using a hash map that maps a value to its index.

- -,最佳答案就是Hash,O(n)。

---------------------------------------------------------又是分割线啦----------------------------------------------------------------------

附上代码:

(1)这个是O(n*logn)的排序+首尾下标:

 /**
* Note: The returned array must be malloced, assume caller calls free().
*/
struct node {
int num;
int local;
}; int cmp(const void * a,const void *b) {
struct node * aa = (struct node *)a;
struct node * bb = (struct node *)b;
if(aa->num == bb->num) {
return aa->local - bb->local;
}else{
return aa->num - bb->num;
}
}
int* twoSum(int* nums, int numsSize, int target) { struct node* a = (struct node*)malloc(numsSize*(sizeof(struct node)));
int * vis = (int *)malloc(*sizeof(int));
int beg = ,end = numsSize-,i;
for(i = ; i < numsSize; i++) {
a[i].num = nums[i];
a[i].local = i+;
}
qsort(a,numsSize,sizeof(a[]),cmp);
for(; beg < end;){
int ans = target - a[beg].num;
while(){
if(a[end].num == ans){
if(a[beg].local < a[end].local){
vis[] = a[beg].local;
vis[] = a[end].local;
}else {
vis[] = a[end].local;
vis[] = a[beg].local;
}
return vis;
}else if(a[end].num < ans){
beg++;
break;
}else {
end--;
}
}
}
free(a);
}

(2)用c++提供的map模拟hash:

 class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int>a;
int i,len;
len = nums.size();
for(i = ; i < len; i++) {
int ans = target - nums[i];
if(a.count(nums[i])){
vector<int> res;
int ans1,ans2;
ans1 = i+;
ans2 = a[nums[i]];
if(ans1 > ans2) {
res.push_back(ans2);
res.push_back(ans1);
return res;
}else {
res.push_back(ans1);
res.push_back(ans2);
return res;
}
}
a[ans] = i+;
}
}
};

一起刷LeetCode1-Two Sum的更多相关文章

  1. leetcode-1 Two Sum 找到数组中两数字和为指定和

     问题描写叙述:在一个数组(无序)中高速找出两个数字,使得两个数字之和等于一个给定的值.如果数组中肯定存在至少一组满足要求. <剑指Offer>P214(有序数组) <编程之美& ...

  2. LeetCode1 Two Sum

    题目 :Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  3. leetcode第一刷_Minimum Path Sum

    能够用递归简洁的写出,可是会超时. dp嘛.这个问题须要从后往前算,最右下角的小规模是已知的,边界也非常明显,是最后一行和最后一列,行走方向的限制决定了这些位置的走法是唯一的,能够先算出来.然后不断的 ...

  4. Leetcode--1. Two Sum(easy)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  5. 129. Sum Root to Leaf Numbers pathsum路径求和

    [抄题]: Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a ...

  6. Add Strings大整数加法十进制求和 & Add Binary二进制求和

    [抄题]: 以字符串的形式给出两个非负整数 num1 和 num2,返回 num1和 num2 的和. 比如一个50位+一个100位. 给定 num1 = "123",num2 = ...

  7. 1001 Sum Problem [ACM刷题]

    这一段时间一直都在刷OJ,这里建一个博客合集,用以记录和分享算法学习的进程. github传送门:https://github.com/haoyuanliu/Online_Judge/tree/mas ...

  8. 周刷题第一期总结(two sum and two numbers)

    由于深深的知道自己是事件驱动型的人,一直想补强自己的薄弱环节算法,却完全不知道从哪里入手.所以只能采用最笨的办法,刷题.从刷题中遇到问题就解决问题,最后可能多多少少也能提高一下自己的渣算法吧. 暂时的 ...

  9. LeetCode刷题 1. Two Sum 两数之和 详解 C++语言实现 java语言实现

    1. Two Sum 两数之和 Given an array of integers, return indices of the two numbers such that they add up ...

随机推荐

  1. Windows下gcc以及Qt的DLL文件调用之总结(三种方法)

    DLL与LIB的区别 :1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立 ...

  2. java:继承

    一.继承: java只支持单继承,一个子类只能继承一个父类,使用继承是为了减少类的重复代码,且父类的构造函数不能被子类继承. 当两个类里面有相同的属性或方法,就应该考虑使用继承解决重复代码了. 继承的 ...

  3. arcengine C# 读写lyr(转)

    写lyr { IFeatureLayer LineLayer = axMapControl1.get_Layer(0) as IFeatureLayer;            ILayerFile ...

  4. iOS 越狱机免证书调试

    目前在XCode上开发的iOS程序只能在模拟器Simulator中运行,如果要放到真机上测试,需要苹果官方认证的开发者账号,购买开发者证书iDP,99美金一年啊! 作为刚开始学习iOS编程的菜鸟,这么 ...

  5. Python第一天——初识Python

    python是由荷兰人Guido van Rossum 于1989年发明的一种面向对象的的解释型计算机程序设语言,也可以称之为编程语言.例如java.php.c语言等都是编程语言. 那么为什么会有编程 ...

  6. 详谈 Jquery Ajax 异步处理Json数据.

    啥叫异步,啥叫Ajax.咱不谈啥XMLHTTPRequest.通俗讲异步就是前台页面javascript能调用后台方法.这样就达到了无刷新.所谓的Ajax.这里我们讲二种方法 方法一:(微软有自带Aj ...

  7. textbox不支持Ctrl+A

    http://stackoverflow.com/questions/5885739/why-are-some-textboxes-not-accepting-control-a-shortcut-t ...

  8. [HDOJ4635]Strongly connected(强连通分量,缩点)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一张图,问最多往这张图上加多少条边,使这张图仍然无法成为一个强连通图. 起初是先分析样例 ...

  9. BootStrap图标

  10. bzoj2251

    以前看到这道题想到的是SA,做起来不是很美观 学了SAM之后,这题简直是随便搞 ..,'] of longint; s,sa,mx,w,fa:..] of longint; i,n,last,t:lo ...