大家好,我是一只学弱狗,记录学习的点点滴滴!
算法才是程序设计的灵魂,每日一题!
优质文章
优质专栏
第一想法,就是暴力枚举
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result(2);
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
if(nums[i]+nums[j]==target){
return {i,j};
}
}
}
return {};
}
};
第二种做法,网上看的,查找表法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> recode;
for(int i=0;i<nums.size();i++){
if(recode.find(target-nums[i]) == recode.end()){
recode[nums[i]]=i;
}else{
return {recode[target-nums[i]],i};
}
}
return {};
}
};
因为是第一次刷LeetCode的题目,有些规则还是不太懂的,搞了挺长时间的。。
以后没做一个题,我都会写一些感想与经验,但是每篇均不会重复
规则此题:我再次熟悉了vector和map的使用
对于vector,它更像java中的ArrayList,如果是函数返回值的时候,可以直接写{1,2}
对于map来说,就比好重要了,有普通的map,也有unordered_map,但是devcpp好像不支持,,,,解决方法如何在Dev-Cpp中使用C++11中的函数
然后就是一些编程习惯,比如若常常使用多次同一个值,像双层for循环使用数组的长度,可以用一个变量来保存,当然,这也是看大佬学到的,
最后就是用查找表法解决这个题,也是我没想到的。。
map的底层实现时红黑树
而unordered_map的底层实现时哈希,如果不考虑排序的话,用unordered_map更快一些
附上最好的代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> rec;
for(int i=0;i<nums.size();i++){
if(rec.find(target-nums[i])==rec.end()){
rec[nums[i]]=i;
}else{
return {rec[target-nums[i]],i};
}
}
return {};
}
};
看了解析,这种能写更少的代码,大家参考下就行,思路一样的
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode;
ListNode* front = head;
int jinwei = 0;
while(l1!=NULL && l2!=NULL){
int sum = l1->val + l2->val + jinwei;
ListNode* tmp = new ListNode(sum%10);
jinwei = sum/10;
front->next = tmp;
front = tmp;
l1 = l1->next;
l2 = l2->next;
}
while(l1!=NULL){
int sum = l1->val + jinwei;
ListNode* tmp = new ListNode(sum%10);
jinwei = sum/10;
front->next = tmp;
front = tmp;
l1 = l1->next;
}
while(l2!=NULL){
int sum = l2->val + jinwei;
ListNode* tmp = new ListNode(sum%10);
jinwei = sum/10;
front->next = tmp;
front = tmp;
l2 = l2->next;
}
if(jinwei!=0){
ListNode* tmp = new ListNode(jinwei);
front->next = tmp;
}
return head->next;
}
};
但是还没上面的那个执行的快。。。