区块链实验告一段落,信号与系统和数据库实验还不那么着急,学了半个月一款自研游戏编辑器感到自己只适合打游戏不适合做游戏,刷了一周末手机,最终决定停止摆烂,开始刷算法,回归大一青春生活(bushi) 。想当年C语言上课老师不咋讲,我也没咋听,全靠做题学语言hhh。
今天先从新手村第一题开始。
这道题有两种思路,一是暴力循环,二是哈希表空间换时间。
1.暴力循环
根据题意,就是要找两个数使其和为目标值。
那只要两层循环就遍历完了。
最坏情况(n,2)(这是组合数的意思),复杂度O(N^2)。
1.1 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)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target:
return [i,j]
else:
continue
1.2 C++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i=0;
int j=0;
//此处定义后result里的值为0
vector<int> result(2);
for(i=0;i<nums.size();i++){
for(j=i+1;j<nums.size();j++){
if (nums[i]+nums[j]==target){
result[0]=i;
result[1]=j;
return result;
}
else{
continue;
}
}
}
return result;
}
};
可见C++确实比Python快。
2.哈希表
令nums里的值为key,下标为value创建哈希表。
算目标值与nums[j]的差,若差在哈希表键值里,则返回其对应的value,即下标值。
2.1 Python
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
index=[i for i in range(len(nums))]
#创建哈希表,nums为键,index为值
hashmap=dict(zip(nums,index))
for j in range(0,len(nums)):
diff=target-nums[j]
if diff in hashmap and j!=hashmap.get(diff):
return [hashmap.get(diff),j]
速度上快了不少,内存也多了不少。
2.2 C++
其实我没学过C++,练算法的同时学C++。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i=0;
int j=0;
vector<int> result(2);
std::map<int,int> hashMap;
for(i=0;i<nums.size();i++){
hashMap[nums[i]]=i;
}
for(i=0;i<nums.size();i++){
int diff=target-nums[i];
if (hashMap.count(diff)&&hashMap[diff]!=i){
result[0]=i;
result[1]=hashMap[diff];
}
}
return result;
}
};
时间快了一些,内存多了不少。看结果我的代码果然还是太烂了。没关系,每日一题,慢慢进步。哦其实也可以写个go版本的,但是好像go语言用处不多,目前的思路是用python练算法,再对着算法练C++。