LeetCode
1. Two Sum
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
#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;
}
};
- 很久之前就开始要“下定决心”做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 {
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);
}
}
}