一起刷LeetCode1-Two Sum
感觉有必要重新刷刷题了,为以后找工作做做准备,选择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的更多相关文章
- leetcode-1 Two Sum 找到数组中两数字和为指定和
问题描写叙述:在一个数组(无序)中高速找出两个数字,使得两个数字之和等于一个给定的值.如果数组中肯定存在至少一组满足要求. <剑指Offer>P214(有序数组) <编程之美& ...
- LeetCode1 Two Sum
题目 :Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- leetcode第一刷_Minimum Path Sum
能够用递归简洁的写出,可是会超时. dp嘛.这个问题须要从后往前算,最右下角的小规模是已知的,边界也非常明显,是最后一行和最后一列,行走方向的限制决定了这些位置的走法是唯一的,能够先算出来.然后不断的 ...
- 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 ...
- 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 ...
- Add Strings大整数加法十进制求和 & Add Binary二进制求和
[抄题]: 以字符串的形式给出两个非负整数 num1 和 num2,返回 num1和 num2 的和. 比如一个50位+一个100位. 给定 num1 = "123",num2 = ...
- 1001 Sum Problem [ACM刷题]
这一段时间一直都在刷OJ,这里建一个博客合集,用以记录和分享算法学习的进程. github传送门:https://github.com/haoyuanliu/Online_Judge/tree/mas ...
- 周刷题第一期总结(two sum and two numbers)
由于深深的知道自己是事件驱动型的人,一直想补强自己的薄弱环节算法,却完全不知道从哪里入手.所以只能采用最笨的办法,刷题.从刷题中遇到问题就解决问题,最后可能多多少少也能提高一下自己的渣算法吧. 暂时的 ...
- 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 ...
随机推荐
- 对象的类型转换P109
类作为一种应用数据类型,和基本数据类型的变量一样.不同类中存在对象与对象之间的类型转问题,对象的类型转换只能在 具有继承关系的 父类对象-----子类对象 之间进行 子类通常比父类拥有更多的域和 ...
- Eclipse:快捷
Ctrl +单击方法------------查看方法 ALT+/ -------------代码助手 Ctrl+O -------------列出方法和成员变量或布局结构 Ctrl+D ...
- Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported
打开navigator,修改下面的classpath文件: 将<classpathentry kind="con" path="org.maven.ide.ecli ...
- C#语句及案例
今天学习了,C#语句部分的分支语句,差点转不过弯来. 语句分类: 1.顺序语句 2.选择语句(分支语句) 3.循环语句 分支语句 (一)if(){} ; 按照顺序哪个if条件适合,执行哪个. 不合适就 ...
- HS-T912 adb 连接配置
手机丢了,花300大洋买的新手机阿...不讨论好不好用,只说怎么用. 安装驱动 linux 跳过 插上电脑,在__通知__里面打开__USB 连接__,会弹出__USB 设置__对话框. 选择__海信 ...
- 三个特殊资源目录 /res/xml /res/raw 和 /assets
在android开发中,我们离不开资源文件的使用,从drawable到string,再到layout,这些资源都为我们的开发提供了极大的便利,不过我们平时大部分时间接触的资源目录一般都是下面这三个. ...
- Fucking "pkg-config not found"
If you got pkg-config not found error in gnu auto tools then, you must install the related librarys ...
- C#获取本机IP以及无线网ip
1 private void GetIP() 2 { 3 string hostName = Dns.GetHostName();//本机名 4 //System.Net.IPAddress ...
- 1128. Partition into Groups(图着色bfs)
1128 写的dfs貌似不太对 bfs重写 用bfs将图进行黑白染色 如果有超过一个与自己颜色相同的点 就把该点存入栈中 最后处理栈中的点 判断此点是否合法 不合法 取反 取反后再判断相邻点是否合法 ...
- Android ContentProvider和Uri详解 (绝对全面)
ContentProvider的基本概念 : 1.ContentProvider为存储和读取数据提供了统一的接口 2.使用ContentProvider,应用程序可以实现数据共享 3.andr ...