-->

Thursday, November 24, 2016

4. Median of Two Sorted Arrays

https://leetcode.com/problems/median-of-two-sorted-arrays/

solution:

这个题目想一口气写好不容易。 需要考虑的细节很多。算法倒是很好理解。既然是sorted array, 那么必须用好排好的序。所以要追求 O(ln n).

代码:
  1. class Solution {
  2. public:
  3.     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
  4.         double res;
  5.         int l1=nums1.size();
  6.         int l2=nums2.size();
  7.         int total = l1 + l2;
  8.         if(total & 0x1){ // total is odd;
  9.             res = findKth(nums1, 0, l1, nums2, 0, l2, total/2 + 1)*1.0;
  10.         }
  11.         else {
  12.             res = (findKth(nums1, 0, l1, nums2, 0, l2, total/2)  
  13. + findKth(nums1, 0, l1, nums2, 0, l2, total/2 + 1))/2.0;
  14.         }
  15.         return res;
  16.     }
  17. private:    
  18. int findKth(vector<int>& v1, int a1, int b1, vector<int>& v2, int a2, int b2, int k){
  19.         int x1=b1-a1;
  20.         int x2=b2-a2;
  21.         if(x1>x2) return findKth(v2, a2, b2, v1, a1, b1, k);
  22.         if(x1==0) return v2[a2+k-1];
  23.         if(k==1) return min(v1[a1], v2[a2]);
  24.         int m=min(x1, k/2);
  25.         int n=k-m;
  26.         if(v1[a1+m-1]<v2[a2+n-1]){
  27.             return findKth(v1, a1+m, b1, v2, a2, b2, k-m);
  28.         }
  29.         else if(v1[a1+m-1]>v2[a2+n-1]){
  30.             return findKth(v1, a1, b1, v2, a2+n, b2, k-n);
  31.         }
  32.         else {
  33.             return v1[a1+m-1];
  34.         }
  35.     }   
  36. };

3. Longest Substring Without Repeating Characters

https://leetcode.com/problems/longest-substring-without-repeating-characters/

solution:
可以使用double pointers. 需要更新最左边和最右边。题目不难, 这时就是看代码怎么写的简洁。

代码:
  1. class Solution {
  2. public:
  3.     int lengthOfLongestSubstring(string s) {
  4.         int res = 0;
  5.         int left = 0;
  6.         vector<int> m(256, 0);
  7.         for (int i=0; i<s.size(); ++i){
  8.             left = max(left, m[s[i]]);
  9.             m[s[i]] = i+1;
  10.             res = max(res, i-left+1);
  11.         }
  12.         return res;
  13.     }
  14. };

2. Add Two Numbers

https://leetcode.com/problems/add-two-numbers/

solution:
需要考虑进位的问题。 然后就是linked list细节了: 生成新节点等等。

代码:
  1. /**
  2.  * Definition for singly-linked list.
  3.  * struct ListNode {
  4.  *     int val;
  5.  *     ListNode *next;
  6.  *     ListNode(int x) : val(x), next(NULL) {}
  7.  * };
  8.  */
  9. class Solution {
  10. public:
  11.     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  12.         ListNode dummy(-1);
  13.         ListNode* p = &dummy;
  14.         int carrier = 0;
  15.         while(l1||l2){
  16.             if(l1) {
  17.                 carrier += l1->val;
  18.                 l1 = l1->next;
  19.             }
  20.             if(l2) {
  21.                 carrier += l2->val;
  22.                 l2 = l2->next;
  23.             }
  24.             p->next = new ListNode(carrier%10);
  25.             p = p->next;
  26.             carrier /= 10;
  27.         }
  28.         if(carrier){
  29.             p->next = new ListNode(carrier);
  30.             p = p->next;
  31.         }
  32.         return dummy.next;
  33.    };

1: Two Sum

https://leetcode.com/problems/two-sum/

solution:
不用hash table的话,需要double pointers. 这样的就 O(n2) 了。
使用hash table的话, 就很直观的 O(n) 了。 然后需要注意一些细节, 比如不要重复计入了, 还有就是可以扫一遍就行了 (hash的同时就可以判断了)。

代码:
  1. class Solution {
  2. public:
  3.     vector<int> twoSum(vector<int>& nums, int target) {
  4.         vector<int> res;
  5.         unordered_map<int, int> map;
  6.         for(int i=0; i<nums.size(); ++i){
  7.             if(map.find(target-nums[i])!=map.end()&&i>map[target-nums[i]]){
  8.                 res.push_back(map[target-nums[i]]);
  9.                 res.push_back(i);
  10.                 return res;
  11.             }
  12.             else map[nums[i]]=i;
  13.         }
  14.         return res;
  15.     }
  16. };