挑戰編程題(二)

昨天的題目:http://www.cnblogs.com/qiange/p/5062213.html
1. 求兩個數的和

給定一個整型數組,從中挑選兩個數字,使其相加爲一個爲一個給定的值,返回這兩個值全部數組中位置下標,位置下標小的在前面,位置下標從1開始。html

 

例如:
輸入:nums= {2,7,11,13}  target=24
輸出:3,4
 
//解法1:最簡單的方法,用兩層循環,算法以下,算法複雜度爲O(n*n)
//這個也是最容易想到的。
vector<int> twoSum1(vector< int>& nums, int target) {
                 int i=0;
                 int count = nums.size();
                 while(i<count){
                                 int j=i+1;
                                 while(j<count){
                                                 if(nums[i]+nums[j]==target){
                                                                vector< int> r;
                                                                r.push_back(i+1);   //下標+1 由於下標從1開始的
                                                                r.push_back(j+1);
                                                                 return r;
                                                }
                                                j++;
                                }
                                i++;
                }
 
}
 
//解法2:利用hash表,c++中能夠使用map。時間複雜度O(n)
vector<int> twoSum2(vector< int>& nums, int target){
                vector< int> result;
                unordered_map< int,int > maping;
                 //1.用數組中nums中的值key,用下標做爲value; 
                 for (int i=0;i<nums.size();i++){
                                maping[nums[i]]=i;
                }
 
                 for (int i=0;i<nums.size();i++){
                                 //2.求的另外一個加數
                                 int otherNum = target-nums[i];
                                 //3.從maping中尋找key爲另外一個加數的value
                                 if(maping.find(otherNum)!=maping.end() && maping[otherNum]!=i){
                                                result.push_back(i+1);
                                                result.push_back(maping[otherNum]+1);
                                                 break;
                                }
                }
 
                 return result;
}
 

  

 
 
兩種算法的運行結果以下:
 
 
第二種方法是一種很巧妙的利用空間來換取時間,並利用了hash快速定位的特別
 
 
今天的題目( Add Two Numbers)
 
  1. 有兩個非負數的鏈表,每一個鏈表都反序的存儲一個多位數字的每一位,(例如:鏈表2->4->3  數字342),如今求兩個鏈表數字的相加,求和的鏈表。
      例如: Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
        Output: 7 -> 0 -> 8
 
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
       //函數
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
 
    }
 
 
 
若有問題,歡迎和我聯繫。 個人郵箱 cq20151207@163.com 
相關文章
相關標籤/搜索