LeetCode

LeetCode

1. Two Sum

  • code
class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        int i = 0, j = numbers.size() - 1;
        vector<int> v(numbers);
        vector<int> res;
        sort(v.begin(), v.end());
        while(v[i] + v[j] != target) {
            if(v[i] + v[j] < target) {
                i++;
            } else {
                j--;
            }
        }
        res.push_back(find_pos_LR(numbers, v[i]) + 1);
        res.push_back(find_pos_RL(numbers, v[j]) + 1);
        if(res[0] > res[1]) {
            swap(res[0], res[1]);
        }
        return res;
    }

    int find_pos_LR(vector<int> &numbers, const int &val) {
        for(int i = 0; i != numbers.size(); ++i) {
            if(numbers[i] == val) {
                return i;
            }
        }
    }

    int find_pos_RL(vector<int> &numbers, const int &val) {
        for(int i = numbers.size() - 1; i >= 0; --i) {
            if(numbers[i] == val) {
                return i;
            }
        }
    }
};

2. Add Two Numbers

  • code
#include <iostream>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    typedef ListNode *Lp;
    typedef ListNode Ln;
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        Lp cur = NULL;
        Lp ret = NULL;
        if(!l1 && !l2) {
            return ret;
        }
        print(l1);print(l2);
        for(Lp b = l1, e = l2; b || e; ) {
            if(!cur) {
                cur = new Ln(0);
                ret = cur;
            } else {
                cur->next = new Ln(0);
                cur = cur->next; 
            }
            if(b) {
                cur->val += b->val;
                b = b->next;
            }
            if(e) {
                cur->val += e->val;
                e = e->next;
            }
        }

        for(Lp b = ret; b; b = b->next) {
            if(b->val >= 10) {
                if(b->next == NULL) b->next = new Ln(0);
                b->next->val += b->val / 10;
                b->val %= 10;
            }
        } 
        print(ret);
        return ret;
    }
    Lp getList(istream &is) {
        Lp ret = NULL, cp = ret;
        int val;
        int cnt; 
        is>>cnt; 
        while(cnt-- && is>>val) {
            if(!ret) {
                ret = new Ln(val);
                cp = ret;
            } else {
                cp -> next = new Ln(val);
                cp = cp->next;
            }
        }
        return ret;
    }
    void print(Lp lp) {
        for(Lp b = lp; b; b = b->next) {
            if(b == lp) {
                cout<<b->val;
            } else {
                cout<<"->"<<b->val;
            }
        }
        cout<<endl;
    }
};


int main() {
    Solution s;
    Solution::Lp l1 = s.getList(cin), l2 = s.getList(cin);
    Solution::Lp res = s.addTwoNumbers(l1, l2);
    s.print(res);
    return 0;
}

3. Longest Substring Without Repeating Characters

#include <string>
#include <iostream>
#include <cstring>
using namespace std;

unsigned char mp[256];
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        size_t i, j;
        int res = 1, tmp = 1;
        memset(mp, 0, sizeof(mp));
        if(s.empty()) return 0;
        mp[s[0]] = 1;
        for(i = 0, j = 1; j < s.size(); ) {
            if(mp[s[j]] == 0) {
                ++tmp;
                mp[s[j]] = 1;
                ++j; 
            } else {
                res = (res < tmp) ? tmp : res;
                while(s[i] != s[j]) {
                    --tmp;
                    mp[s[i]] = 0;
                    ++i;
                }
                ++i;++j;
            }
            if(j == s.size()) {
                res = (res < tmp) ? tmp : res;
            }
        }
        return res;
    }
};

4. Median of Two Sorted Arrays

  • 很久之前就开始要“下定决心”做leetcode,但是这决心似乎太廉价了写。这道题从一年3个月前就开始在写,都没有写好,写过几次,每一次几乎都是一次决心啊,哈哈。可见我只代码与算法的功底实在是弱。对,这道题我是在拾人牙慧,参考别人的做法。同时,也作为又一轮“下决心”,我要开始好好刷题了,并且在这里记录一下
  • 题意,求两个有序数列的中位数,就是把两个数组合起来,排个序,然后如果数列的数目为奇数,中位数就是排在中间位置的the one,如果为偶数,中位数就是排在中间位置的the two的平均
  • 要求,O(log(m+n))的复杂度
  • code
class Solution {
public:
    double findMedianSortedArrays(vector<int>& v1, vector<int>& v2) {
        int s1 = v1.size();
        int s2 = v2.size();
        int tmp = s1 + s2;
        if(tmp & 1) {
            return find_kth(v1, 0, s1, v2, 0, s2, tmp / 2 + 1);
        } else {
            //return (find_kth(v1, 0, s1, v2, 0, s2, tmp / 2 - 1) + 
                    //find_kth(v1, 0, s1, v2, 0, s2, tmp / 2)) / 2;
            double tp1, tp2;
            tp1 = find_kth(v1, 0, s1, v2, 0, s2, tmp / 2);
            tp2 = find_kth(v1, 0, s1, v2, 0, s2, tmp / 2 + 1);
            return (tp1 + tp2) / 2;
        }
    }

    double find_kth(vector<int> & v1, int base1, int s1, vector<int> & v2, int base2,
         int s2, int k) {
        if(s1 > s2) {
            return find_kth(v2, base2, s2, v1, base1, s1, k);
        }
        if(s1 == 0) {
            return v2[base2 + k - 1];
        }
        if(k == 1) {
            return min(v1[base1], v2[base2]);
        }
        int p1 = min(s1, k / 2), p2 = k - p1;
        if(v1[base1 + p1 - 1] <= v2 [base2 + p2 - 1]) {
            return find_kth(v1, base1 + p1, s1 - p1, v2, base2, s2, k - p1);
        } else {
            return find_kth(v1, base1, s1, v2, base2 + p2, s2 - p2, k - p2);
        }
    }   

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值