LeetCode——Problem1:two sum
早就想刷LeetCode了,但一直在拖,新学期开学,开始刷算法。
我准备从Python和C++两种语言刷。一方面我想做机器学习,以后用Python会比较多,联系一下。另一方面C++或者C语言更接近底层,能够让我更深入的理解算法。
1、题目
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.
Example:
Given nums = [2, 7, 11, 15],target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
2、Python解法
我是这样写的
class Solution(object):
def twoSum(self,nums,target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(0,len(nums)-1):
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target:
return i,j nums=[2,7,11,15]
target=9
result=Solution()
result_num=result.twoSum(nums,target)
print(result_num)
其中遇到了一个错误
这个因为之前我后面几行的代码是
nums=[2,7,11,15]
target=9
result_num=Solution.twoSum(nums,target)
print(result_num)
没有初始化Solution类,改成上面第23行先初始化一下就行了
然而。。。这个代码完全不能通过LeetCode的测试。算法复杂度太高
然后我看了别人写的
class Solution(object):
def twoSum(self,nums,target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
result = {}
if n <= 1:
return False
else:
for i in range(n):
if nums[i] in result:
return result[nums[i]],i
else :
result[target-nums[i]]=i nums=[2,7,11,15]
target=9
result=Solution()
result_num=result.twoSum(nums,target)
print(result_num)
就是借用字典的key-value进行的匹配,算法复杂度仅为O(n)
然后还看到了这个
class Solution(object):
def twoSum(self, nums, target): for ind, num in enumerate(nums):
if target-num in nums and nums.index(target-num) != ind:
return [ind, nums.index(target-num)]
return -1
直接利用了列表的索引。
运行速度仅为4ms
但是其中肯定用到了其他遍历比如nums.index(target-num)。这就是Python最大的优势吧。简单,容易理解。
3、C语言解法
说实话,我还没系统的学过C++呢。专业不是这类的,学校不给我们安排课。这次先用C。等我慢慢学学C++再用C++
我的解法:
#include<stdio.h> /**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target) {
int i,j;
static int result[];
for(i=;i<numsSize-;i++)
{
for(j=i+;j<numsSize;j++)
{
if(*(nums+i)+*(nums+j)==target)
{
*result = i;
*(result+)=j;
}
}
}
return(result);
}
int main()
{
int nums[]={,,,};
int target = ;
int numSize=;
int *result;
result=twoSum(nums,numSize,target);
printf("succeed\n");
for(int i=;i<;i++)
{
printf("%d\n",*(result+i));
} return ;
}
只是简单的遍历。丝毫没有新意
大神解法:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/ int* twoSum(int* nums, int numsSize, int target) {
int i, max, min;
max = min = nums[];
for(i = ; i < numsSize; i++) {
if(nums[i] > max) max = nums[i];
if(nums[i] < min) min = nums[i];
} int *map = (int*)calloc((max-min+), sizeof(int));
int *reval = (int*)malloc(sizeof(int)*); for(i = ; i < numsSize; map[nums[i]-min] = ++i) {
int lookfornum = target - nums[i];
if(lookfornum < min || lookfornum > max) continue;
int dis = lookfornum - min;
if (map[dis]) {
reval[] = i;
reval[] = map[dis] -;
break;
}
} return reval; }
这个是所有解法里运行的最快的了。引用了我根本没听说过的map。我也很无奈呀。还要注意内存的申请呀。不过我好像没看到free
今天比较晚了。我还想再画画程序流程图的,既然做了,就要做透。
LeetCode——Problem1:two sum的更多相关文章
- Java for LeetCode 216 Combination Sum III
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- LeetCode 1 Two Sum 解题报告
LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...
- [leetCode][013] Two Sum 2
题目: Given an array of integers that is already sorted in ascending order, find two numbers such that ...
- [LeetCode] #167# Two Sum II : 数组/二分查找/双指针
一. 题目 1. Two Sum II Given an array of integers that is already sorted in ascending order, find two n ...
- [LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针
一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of ...
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- [array] leetcode - 39. Combination Sum - Medium
leetcode - 39. Combination Sum - Medium descrition Given a set of candidate numbers (C) (without dup ...
- LeetCode one Two Sum
LeetCode one Two Sum (JAVA) 简介:给定一个数组和目标值,寻找数组中符合求和条件的两个数. 问题详解: 给定一个数据类型为int的数组,一个数据类型为int的目标值targe ...
- [leetcode]40. Combination Sum II组合之和之二
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...
随机推荐
- vue-绑定style、css
class.style的绑定1.在 v-bind 用于 class 和 style 时, Vue.js 专门增强了它.表达式的结果类型除了字符串之外,还可以是对象或数组2.绑定css2.1对象绑定2. ...
- hiho一下 第三十七周 二分查找之k小数
题目链接:http://hihocoder.com/contest/hiho37/problem/1 , 简单二分. 算法: 题目即为求一个无序数组数组中第k小的数,由于数据量太大,排序是会超时的. ...
- JS中的toString()和valueOf()方法
1.toString()方法:主要用于Array.Boolean.Date.Error.Function.Number等对象转化为字符串形式.日期类的toString()方法返回一个可读的日期和字符串 ...
- NYOJ-22-素数求和问题
原题地址 素数求和问题 描述 现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和. 输入 第一行给出整数M(0<M<10)代表多少组测 ...
- 使用RichTextBox控件保存文件
实习效果: 知识运用: RichTextBox控件的SaveFile方法 SaveFileDialog对象的ShowDialog方法 实现代码: private void 打开RTF文件ToolStr ...
- python_13_break
for i in range(5): print('-----------',i) for j in range(5): print(j) if j>2: break####结束当前循环
- java基础编程—统计二进制数中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目代码 /** * 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. * Created by YuKai ...
- 2017年9月11日 梁勇 java教材 编程练习题 第二章 2.15 键盘 读取两个点的坐标值(小数),控制台输出两点间距离。
package com.swift; import java.util.Scanner; public class PToP { public static void main(String[] ar ...
- split 分割压缩文件
1.普通tar压缩命令 tar -zcvf cm-11.tar.gz cm-11 //将cm-11文件夹压缩成cm-11.tar.gz 2.压缩后的文件太大,需要将cm-11.tar.gz分割成N个指 ...
- Java,集合按自定义规则排序
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...