leetcode 001-003 两数之和 两数相加 无重复的字符串

001 两数之和 哈希表

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
      unordered_map<int,int>  myhash;
      vector<int>ans;
      vector<int>::iterator i;
      for(i=nums.begin();i<nums.end();i++){
          unordered_map<int,int>::iterator wh=myhash.find(target-*i);
          if(wh!=myhash.end()) {
              ans.push_back((*wh).second);
              ans.push_back(i-nums.begin());
          }
          myhash[*i]=i-nums.begin();
      }
        return ans;
    }
};

看来我的空间复杂度比理论上的要大很多

002 两数相加 单链表,指针

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *ans=new ListNode,*st=ans,*ans2=new ListNode;
        ans->next=NULL;
        bool flag=false;
        for(;;){
            ListNode *tmp=new ListNode;
            int first=(l1!=NULL)?l1->val:0,second=(l2!=NULL)?l2->val:0;
            tmp->val=(first+second);
            if(flag) tmp->val++;
            else if(!(flag) && l1==NULL && l2==NULL) break;
            if((tmp->val)>9) {flag=true;tmp->val=(tmp->val)%10;}
            else flag=false;
            tmp->next=ans->next;
            ans->next=tmp;
            ans=ans->next;
            if(l1==NULL && l2==NULL) break;   
            l1=(l1!=NULL)?l1->next:NULL;
            l2=(l2!=NULL)?l2->next:NULL;
        }
        return st->next;
    }
};

这次是速度的问题
003 无重复字符的串 窗口滑动,哈希表

class Solution {
public:  
    int lengthOfLongestSubstring(string s) {
        int len=s.length(),max=0,now=0,i=0,j=0;
        unordered_map<char,int> myhash;
        unordered_map<char,int>::iterator it;
        if(len==0) return 0;
        for(;;){
                it=myhash.find(s[i]);
                if(it==myhash.end()){
                    myhash[s[i]]=1;
                    now++;
                    max=(max>now)?max:now;
                    if(i==len-1) break;
                    i++;
                }
                while(it!=myhash.end()){
                    myhash.erase(s[j]);
                    j++;
                    now--;
                    it=myhash.find(s[i]);
                }   

            }
        return max;
    }
};

看起来我的程序非常的粗糙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值