七月二十,暴雨火锅
- 今天的北京瓢泼大雨,雨季以来第二整天的暴雨,对的就是暴雨!据说雨天适合吃火锅,中午去高兴火锅的路上体验了什么是狂风暴雨。我的装备回头率也较高:去年在泰山脚下买的5元一次性雨衣,洗澡穿的镂空拖鞋,黑色超短裤,备受争议的绿色T恤,防晒外套,还有职圈大伞。一路上就像在洗冷水澡,整条腿都湿了,雨似乎是横着下的。
- 饭后,GTA第二次有机会7h连玩。似乎真的没有什么能收的住我野马般在贪玩中放荡不羁的心了=。=
今天舒舒服服的用Mac刷题了
用电脑就是快,可我还是熬夜了 T,T
349.Intersection of Two Arrays
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].
Note:
Each element in the result must be unique.
The result can be in any order.
我整理过的代码
我用的方法是先排序,再一次遍历比较大小的方法。
速度上打败了43%,还不是最佳。此前第一次AC只打败了个位数%,优化了下,只能到这个程度了。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//先将两个容器升序排序
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
//声明2个容器的指标
int i = 0;
int j = 0;
int len1 = nums1.size();
int len2 = nums2.size();
vector<int> ans;
while(i < len1 && j < len2){ //ij有任何一个到头了就结束
if(nums1.at(i) == nums2.at(j)){
if(!ans.size() || nums1.at(i) > ans.back()){
//不等于ans最后一个值或ans还没有第一个值
ans.push_back(nums1.at(i));
}
i++;
j++;
}else if(nums1.at(i) < nums2.at(j)){
//1容器的值比2容器的值小,则1指标++,2指标不动。
i++;
}else{
j++;
}
}
return ans;
}
};
容器Vector的一些用法
第一次使用Vector,经过查询,终于知道了基础用法。
//声明
vector <int> tmp;
//排序,begin()和end()分别是首尾地址
sort (tmp.begin(), tmp.end());
//首尾元素分布是:
tmp.front();
tmp.back();
//在末尾添加一个元素
tmp.push_back();
//有多少元素
tmp. size();
//取坐标为i的值
tmp. at(i);
更多用法搜索即可。
自己想出来的原理
逐渐习惯了不去验证别人的解答,尽量独立思考。
先将两个数组排序好,同方向从0开始移动坐标,相同的第一个存下来,直到有一个数组到头了。
从单纯的有这个思路,中间查了如何排序、Vector怎么用,再调试实现,还是耗时1小时以上的。
要知道sort()的实现方法
排序分内部排序和外部排序,大约共8种典型的排序算法。
快速排序是内部排序中最佳的算法了,时间复杂度是nlogn,不稳定,适用于随机数。
快速排序是递归的思想,分而治之,填坑。具体的实现方式,我想我今后还会遇到,希望能早日做到手写快排。
——End 2016-07-21 01:16:07——