1. 程式人生 > >LeetCode刷題學習記錄--P1. Two Sum

LeetCode刷題學習記錄--P1. Two Sum

前言

大四越發感覺到程式碼能力的不足,雖然現在處於申請美研的階段暫時逃開了找工作的問題,但是之前找實習碰壁的陰影和愈發感覺的到的找工作壓力讓我有了每天學幾道LeetCode的想法,從現在開始積累一些演算法提升一下程式碼能力,也方便自己以後翻閱查詢知識點。

Problem 1. Two Sum

題目描述

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].

演算法思想

最開始的想法自然是暴力列舉,但是顯然,OJ並不會讓你在時間限制上舒舒服服暴力列舉。此處,暴力列舉是個O(N2)的時間複雜度,一般來說,我們為了提高時間的複雜度,需要用空間來換,程式碼界中的妥協吧。如何我們要用線性的時間複雜度O(N)來解決問題,那麼就是說只能遍歷一個數字,那麼另一個數字呢,我們可以事先將其儲存起來,使用一個HashMap,來建立數字和其座標位置之間的對映,HashMap是常數級的查詢效率,這樣,我們在遍歷陣列的時候,用目標數值target減去遍歷到的數字,就是另一個需要的數字了,直接在HashMap中查詢其是否存在即可,注意要判斷查詢到的數字不是第一個數字,比如target是8,遍歷到了一個4,那麼另外一個4不能是當前遍歷到的這個4,整個實現步驟為:先遍歷一遍陣列,建立HashMap對映,然後再遍歷一遍,開始查詢,找到且不重複,則記錄index。

學到的知識點

  1. unordered_map與STL 這篇部落格 Link 介紹了STL——map/unordered_map 在C++11中有新出4個關聯式容器:unordered_map/unordered_set/unordered_multimap/unordered_multiset。 這4個關聯式容器與map/multimap/set/multiset功能基本類似,最主要就是底層結構不同,使用場景不容。 如果需要得到一個有序序列,使用紅黑樹系列的關聯式容器,如果需要更高的查詢效率,使用以雜湊表為底層的關聯式容器。
  2. vector 這篇部落格Link主要介紹了C++ vector的基本用法。

注意的點

  1. 運算子優先順序
  if (m.count(t) && m[t] != i)

這句程式碼中,要注意&&的優先順序低於 != 。 詳細C++運算子優先順序見此Link

程式碼

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> m;
        vector<int> res;
        for (int i = 0; i < nums.size(); ++i) {
            m[nums[i]] = i;
        }
        for (int i = 0; i < nums.size(); ++i) {
            int t = target - nums[i];
            if (m.count(t) && m[t] != i) {
                res.push_back(i);
                res.push_back(m[t]);
                break;
            }
        }
        return res;
    }
};