感觉有必要重新刷刷题了,为以后找工作做做准备,选择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. C#操作.csv文件Demo

    1.使用OleDB操作.csv文件,比较费时 public static DataTable GetDataTableFromCsv(string path,bool isFirstRowHeader ...

  2. 37. Sudoku Solver

    题目: Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated b ...

  3. 开源入侵检测系统OSSEC搭建之二:客户端安装

    上一篇文章中已经将OSSEC服务端的安装以及客户端的Key导出操作做了解说,接下来在另一台虚拟机中安装客户端,与安装服务端类似同样需要安装ossec,步骤如下. 一.下载ossec-hids-2.8. ...

  4. Android TextView多行文本滚动实现

    Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局.只要在l ...

  5. JBoss - 调整JVM内存 -Xms512m -Xmx1024m

    $JBOSS-HOME/server/下有3个目录,all/default/minimal,它们是表示3种配置,全部的配置.默认配置.最小配置,我们在启动JBOSS服务时,可以指定 run –c al ...

  6. 使用设置报头x-Frame-Options限制iframe网页嵌套

    x-frame-options的出现一部分是为了防止一些别有用心的者制作钓鱼网站,现在支持的浏览器有一下: chrome 4.1.249.1042 firefox 3.6.9(1.9.2.9) IE ...

  7. Effective C++学习笔记 条款04:确定对象被使用前已先被初始化

    一.为内置类型对象进行手工初始化,因为C++不保证初始化它们. 二.对象初始化数据成员是在进入构造函数用户编写代码前完成,要想对数据成员指定初始化值,那就必须使用初始化列表. class A { pu ...

  8. poj 2828 Buy Tickets (线段树)

    题目:http://poj.org/problem?id=2828 题意:有n个人插队,给定插队的先后顺序和插在哪个位置还有每个人的val,求插队结束后队伍各位置的val. 线段树里比较简单的题目了, ...

  9. HDU 4927 大数运算

    模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostrea ...

  10. poj3207 Ikki’s Story IV – Panda’s Trick

    2-SAT. tarjan缩点.强连通分量的点要选一起选. #include<cstdio> #include<algorithm> #include<cstring&g ...