1. 程式人生 > >Leetcode (Two Sum)

Leetcode (Two Sum)

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。

給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution {
public:
     vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> num;
        for(int i=0;i<nums.size()-1;i++)
        {
            for(int j=i+1;j<nums.size();j++)
            {
                if(nums[i]+nums[j]==target){
                num.push_back(i);
                num.push_back(j);
                break;
                }
            }
        }
         return num;
    }
};

vector<int> twoSum(vector<int>& nums, int target) {}

這是一個函式 形式是 :返回值 函式名(引數表){函式體} 其中返回值是vector<int>,是個 vector; 函式名是twoSum; 引數表顯示要兩個引數:第一個引數是vector<int> &numbers(這個引數的型別是vector<int>,傳參的方式是引用)。第二個引數是 int target(這個引數的型別是int,傳參的方式是傳值);

vector是表示可變大小陣列的序列容器。

就像陣列一樣,vector也採用的連續儲存空間來儲存元素。也就是意味著可以採用下標對vector的元素進行訪問,和陣列一樣高效。但是又不像陣列,它的大小是可以動態改變的,而且它的大小會被容器自動處理。

本質講,vector使用動態分配陣列來儲存它的元素。當新元素插入時候,這個陣列需要被重新分配大小為了增加儲存空間。其做法是,分配一個新的陣列,然後將全部元素移到這個陣列。就時間而言,這是一個相對代價高的任務,因為每當一個新的元素加入到容器的時候,vector並不會每次都重新分配大小。

vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因為儲存空間比實際需要的儲存空間更大。不同的庫採用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是對數增長的間隔大小,以至於在末尾插入一個元素的時候是在常數時間的複雜度完成的。

因此,vector佔用了更多的儲存空間,為了獲得管理儲存空間的能力,並且以一種有效的方式動態增長。

與其它動態序列容器相比(deques, lists and forward_lists), vector在訪問元素的時候更加高效,在末尾新增和刪除元素相對高效。對於其它不在末尾的刪除和插入操作,效率更低。比起lists和forward_lists統一的迭代器和引用更好。

加入元素的方法主要有三種:push_back(),insert()和assign()。

最常用的方法為push_back(),作用是在vector的末尾插入新元素; insert()第一個引數為迭代器,作用為在迭代器前面插入新元素; assign(5,1)向vector中加入5個1,同時清除掉以前的元素。

遍歷vector中元素的方法主要有兩種,一種是通過下標運算子訪問元素,一種是通過迭代器訪問。

通過下標遍歷

for(int i=1;i<vec.size();++i){
  cout<<vec[i];
}

過迭代器訪問

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++){
    cout<<*it;
}

刪除vector中元素的方法:

pop_back()可以刪除最後一個元素。 erase()可以刪除由一個iterator指出的元素,也可以刪除一個指定範圍的元素。 clear()方法可以清空所有元素。 還可以採用通用演算法remove()來刪除vector容器中的元素。