日志-做leetcode算法题

        从今天开始(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值