从今天开始(2018.12.1),每天写一道leetcode算法题,写C++和Python两种语言的。不是对口专业,在编程方面功底也不强,之前也啃过编程的书,但是感觉一切都在实践里,光啃书不行。看大佬们是怎么想的,怎么优化算法的。希望借此了解一些数据结构和算法设计的基础知识。望天长日久,有所长进。每天在这里更新记录,自我监督!
1. Two Sum
- 蛮力法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> result; 声明int类型的vector类对象
int N=nums.size(); 返回向量长度
for(int i=0;i<N-1;i++)
{
int k=target-nums[i]; ---------------------
for(int j=i+1;j<N;j++)
{
if(nums[j]==k) ---------------------
{ result.push_back(i); 在末尾添加数据
result.push_back(j);
break;}
}
}
return result;
}
};
- map数据结构:只循环一次
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
map<int, int> lookup;
int N = nums.size();
for(int i = 0; i < N; i++)
{
if( lookup.count(target - nums[i]) ) 返回元素的个数:有1,无0。map中不存在相同元素,故返回值只能是1或0
{
vector<int> ret;
ret.push_back(lookup[target - nums[i]]); 键 值,位置和下面的insert函数的参数对应
ret.push_back(i);
return ret;
}
lookup.insert(pair<int, int>(nums[i], i));
}
}
};
少声明变量,省时。
python 同样算法偏慢
class Solution:
def twoSum(self, nums, target):
nums_dict=dict(zip(nums,range(len(nums)))) 将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
for i in range(len(nums)):
complement=target-nums[i]
if complement in nums_dict.keys() and nums_dict[complement]!=i: 返回所有键值,可用list转化为列表
return([i,nums_dict[complement]])
2.Add data
- C++链表
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* pHead=new ListNode(0);
ListNode *pCurrent=pHead;
int overload=0;//是不是有进位;有进位为1;
while(l1||l2||overload)
{
int sum=(l1?l1->val:0)+(l2?l2->val:0)+overload;//某一位的值为l1/l2的值加上进位的值;
if(sum>=10)//如果这个和大于10
{
sum%=10;//更新这个值
overload=1;//并且产生进位;
}
else
overload=0;
pCurrent->next=new ListNode(sum);//将当前的值赋给第一位,也就是个位数;
pCurrent=pCurrent->next;//当前的位置往下进行;也就是十位数
if(l1) l1=l1->next;//l1链表往后遍历;
if(l2) l2=l2->next;//l2链表往后遍历;
}
return pHead->next;
}
};
- Python
class Solution:
def addTwoNumbers(self, l1, l2):
p=result=ListNode (-1)
temp=0
while l1 and l2:#当l1和l2属于同长度部分
sum=l1.val+l2.val+temp
temp=int(sum/10)
ptemp=ListNode(sum%10)
p.next=ptemp
p=p.next
l1=l1.next
l2=l2.next
temp1=l1 or l2
while temp1:#当l1和l2属于不同长度部分
sum=temp1.val+temp
temp=int(sum/10)
ptemp=ListNode(sum%10)
p.next=ptemp
p=p.next
temp1=temp1.next
if temp:
p.next=ListNode(temp)
return result.next