???~~~~~~歡迎光臨知星小度博客空間~~~~~~???
???零星地變得優秀~也能拼湊出星河~???
???我們一起努力成為更好的自己~???
???如果這一篇博客對你有幫助~別忘了點贊分享哦~???
???如果有什么問題可以評論區留言或者私信我哦~???
?????? 個人主頁??????
上一篇博客我們已經對set容器進行了詳細的介紹,相信大家對set有了更加深刻的認識,光說不練假把式,這一篇博客我們就來使用set容器在我們的算法題大放異彩~準備好了嗎~我們發車去探索C++的奧秘啦~🚗🚗🚗🚗🚗🚗
兩個數組的交集
兩個數組的交集
????????按照我們以前的思路我們可以新建一個數組,然后遍歷原來的兩個數組,找到重復元素保存到新數組里面~
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{
int i=0;
int j=0;
int k=0;
int count=0;
int*arr=(int*)malloc(sizeof(int)*1000);
for (i = 0; i < nums1Size; i++)
{int flag = 1;for (j = 0; j < nums2Size; j++){if (nums1[i] == nums2[j]){for (k = 0; k <= count; k++){if (arr[k] == nums1[i]){flag = 0;break;}}if (flag != 0){arr[count] = nums1[i];count++;}break;}}
}*returnSize=count;return arr;
}
????????現在有了set容器,我們就可以采用新思路:
??????? 1、分別使用兩個set容器保存兩個數組元素,這就完成了去重+排序的功能,我們后面也就不需要處理重復的問題~
??????? 2、使用迭代器遍歷容器,這里有兩種情況
????????????????如果相等就保存到返回的數組中,迭代器都++
??????????????? 如果不相等就讓元素小的那個迭代器進行++
class Solution
{
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {//使用set保存數據set<int> s1(nums1.begin(),nums1.end());set<int> s2(nums2.begin(),nums2.end());vector<int> ret;//使用迭代器遍歷auto it1=s1.begin();auto it2=s2.begin();while(it1 != s1.end() && it2 != s2.end())//一個走到末尾就結束{//如果相等保存數據,然后都++if(*it1==*it2){ret.push_back(*it1);it1++;it2++;}//不相等,小的++else if(*it1 < *it2){it1++;}else if(*it1 > *it2){it2++;}}return ret;}
};
成功通過,并且時間復雜度也十分優秀~
環形鏈表Ⅱ
環形鏈表Ⅱ
這個題目我們也使用C語言做過,可以看看這篇博客的代碼題目練習之鏈表那些事兒(再續)
可以看出當時思路還是比較復雜的,還需要進行證明才得出來思路,現在有了set容器,我們就可以降維打擊了~
新思路:
??????? 使用set容器保存結點指針,使用set的count進行計數,如果它已經有了,說明結點指針重復,那么這就是一個環形鏈表,當前結點指針就是第一個入環的,直接返回;如果沒有插入set,繼續遍歷~
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution
{
public:ListNode *detectCycle(ListNode *head) {set<ListNode*> s;ListNode* cur = head;while(cur){//如果有就成環了,直接返回if(s.count(cur)) return cur;//如果沒有,插入容器繼續遍歷s.insert(cur);cur=cur->next;}//走到結束return nullptr;}
};
成功通過,我們可以看到這個set的妙處就更加明顯啦~
當然,我們除了使用count判斷,還可以使用insert的返回值進行判斷,前面我們說set容器insert接口返回值類型是pair類型,第二個是bool類型的,如果返回的是false說明插入失敗,那么這就是第一個入環結點了~
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution
{
public:ListNode *detectCycle(ListNode *head) {set<ListNode*> s;ListNode* cur = head;while(cur){//根據insert返回值判斷if(s.insert(cur).second==false) return cur;cur=cur->next;}//走到結束return nullptr;}
};
這里的代碼也就更加簡單,不得不說set容器的使用大大提高了我們的效率,我們要學會在合適的時候進行使用~這樣就可以事半功倍了~
???本篇博客內容結束,期待與各位優秀程序員交流,有什么問題請私信???
???如果這一篇博客對你有幫助~別忘了點贊分享哦~???
??????個人主頁??????