大二第二周,刷下6+12道力扣(力扣+哈希)。

相信我,我会永远坚持下去的!

目录

第一题:两个数组的交集(力扣349)

第二题:有序数组的单一元素

第三题:特殊数组的特征值

第四题:两个数组间的距离值

第五题:寻找数组的中心下标

第六题:除自身以外数组的乘积

下面是哈希专题

1.设计哈希集合:

2.设计哈希映射

3.存在重复元素

4.只出现一次的数字

5.两个数组的交集

6.两数之和

7.同构字符串

8.两个列表的最小索引总和

9.字符串中的第一个唯一字符

10.两个数组的交集(II)

11.存在重复的元素

12.字母异位词分组 


第一题:两个数组的交集(力扣349)

题目链接:力扣349

解题代码:(双指针法,哈希表)

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int length1=nums1.size();int length2=nums2.size();
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        int index1=0;int index2=0;vector<int>arr;
        while(index1<=length1-1&&index2<=length2-1){
          if(nums1[index1]==nums2[index2])
          {
              if(!arr.size()||arr.back()!=nums1[index1]){
              arr.push_back(nums1[index1]);
              }
              index1++;
              continue;
          }
            else if(nums1[index1]>nums2[index2])index2++;
            else index1++;
        }
        return arr;
    }
};
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int>hashset(nums1.begin(),nums1.end());
        unordered_set<int>result;
        for(int num:nums2){
            if(hashset.find(num)!=hashset.end())result.insert(num);
        }
        vector<int> res(result.begin(),result.end());
        return res;
    }
};

第二题:有序数组的单一元素

题目链接:力扣540

解题代码:

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
int left=0;int right=1;
     while(right<nums.size()){
         if(nums[left]==nums[right]){
             left+=2;
             right+=2;
         }
         else return nums[left];
     }
        return nums[nums.size()-1];
    }
};

第三题:特殊数组的特征值

题目链接:力扣1608

解题代码:

class Solution {
public:
    int specialArray(vector<int>& nums) {
sort(nums.rbegin(),nums.rend());
    nums.push_back(0);
        for(int i=0;i<nums.size();i++){
            if(nums[i]<i&&nums[i-1]>=i)return i;
        }
        return -1;
    }
};

第四题:两个数组间的距离值

题目链接:力扣1385

解题代码:

class Solution {
public:
    int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d) {
        int result=0;
for(int i=0;i<arr1.size();i++){
    int cnt=0;
    
    for(int j=0;j<arr2.size();j++){
        if(arr1[i]-arr2[j]>d||arr1[i]-arr2[j]<-d)++cnt;
        else break;
    }
    if(cnt==arr2.size())++result;
}
        return result;
    }
};

第五题:寻找数组的中心下标

题目链接:力扣724

解题代码:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
long total=accumulate(nums.begin(),nums.end(),0);
        long sum=0;
        for(int i=0;i<nums.size();i++){
            if(2*sum+nums[i]==total)return i;
            else sum+=nums[i];
        }
        return -1;
    }
};

第六题:除自身以外数组的乘积

题目链接:力扣238

解题代码:

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        vector<int>left(n,0);vector<int>right(n,0);
        vector<int>answer(n,0);
        left[0]=1;right[n-1]=1;
        for(int i=1;i<n;i++){
            left[i]=left[i-1]*nums[i-1];
        }
        for(int i=n-2;i>=0;i--){
            right[i]=right[i+1]*nums[i+1];
        }
        for(int i=0;i<n;i++){
            answer[i]=left[i]*right[i];
        }
        return answer;
    }
};

下面是哈希专题

1.设计哈希集合:

题目链接:力扣705

解题代码:

#define MAXSIZE 10000
class MyHashSet {
    private:
    vector<int>set1[MAXSIZE];
    int GetIndex(int number){
        return number%MAXSIZE;
    }
    int GetPos(int number,int index){
        for(int i=0;i<set1[index].size();i++){
            if(number==set1[index][i])return i;
        }
        return -1;
    }
public:
    /** Initialize your data structure here. */
    MyHashSet() {

    }
    
    void add(int key) {
int index=GetIndex(key);
if(GetPos(key,index)==-1)set1[index].push_back(key);
    }
    
    void remove(int key) {
int index=GetIndex(key);
int pos=GetPos(key,index);
        if(pos!=-1){
        set1[index].erase(set1[index].begin()+pos);
    }
    }
    /** Returns true if this set contains the specified element */
    bool contains(int key) {
int index=GetIndex(key);
        if(GetPos(key,index)==-1)return false;
        else return true;
    }
};

/**
 * Your MyHashSet object will be instantiated and called as such:
 * MyHashSet* obj = new MyHashSet();
 * obj->add(key);
 * obj->remove(key);
 * bool param_3 = obj->contains(key);
 */

2.设计哈希映射

题目链接:力扣706

解题代码:

#define MAX_LEN 10000
class MyHashMap {
private:
vector<pair<int,int>>map[MAX_LEN];
    int GetIndex(int key){
        return key%MAX_LEN;
    }
    int GetPos(int key,int index){
        for(int i=0;i<map[index].size();i++){
            if(map[index][i].first==key)return i;
        }
        return -1;
    }
public:
    /** Initialize your data structure here. */
    MyHashMap() {

    }
    
    /** value will always be non-negative. */
    void put(int key, int value) {
int index=GetIndex(key);
        int pos=GetPos(key,index);
        if(pos==-1){
            map[index].push_back(make_pair(key,value));
        }
        else {
            map[index][pos].second=value;
        }
    }
    
    /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */
    int get(int key) {
int index=GetIndex(key);
        int pos=GetPos(key,index);
        if(pos==-1)return -1;
        else return map[index][pos].second;
    }
    
    /** Removes the mapping of the specified value key if this map contains a mapping for the key */
    void remove(int key) {
int index=GetIndex(key);
        int pos=GetPos(key,index);
        if(pos==-1)return;
        else {
            map[index].erase(map[index].begin()+pos);
        }
    }
};

/**
 * Your MyHashMap object will be instantiated and called as such:
 * MyHashMap* obj = new MyHashMap();
 * obj->put(key,value);
 * int param_2 = obj->get(key);
 * obj->remove(key);
 */

3.存在重复元素

题目链接:力扣217

解题代码:

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size()-1;i++){
            if(nums[i]==nums[i+1])return true;
        }
        return false;
    }
};

4.只出现一次的数字

题目链接:力扣136

解题代码:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
int result=nums[0];
        for(int i=1;i<nums.size();i++){
          result=result^nums[i];  
        }
        return result;
        
    }
};

5.两个数组的交集

题目链接:力扣349

解题代码:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int>hashset(nums1.begin(),nums1.end());
        unordered_set<int>result;
        for(int num:nums2){
            if(hashset.find(num)!=hashset.end())result.insert(num);
        }
        vector<int> res(result.begin(),result.end());
        return res;
    }
};

6.两数之和

题目链接:力扣1   ​​​​​​   ​​​​​​

解题代码:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int>hashmap;
        for(int i=0;i<nums.size();i++){
            auto it=hashmap.find(target-nums[i]);
            if(it!=hashmap.end())return{i,it->second};
            else hashmap[nums[i]]=i;
        }
        return {};
    }
};

7.同构字符串

题目链接:力扣205 

解题代码:

class Solution {
public:
    bool isIsomorphic(string s, string t) {
unordered_map<char,char>hashmap;
unordered_map<char,char>t2s;
        for(int i=0;i<s.size();i++){
            auto it=hashmap.find(s[i]);
            if(it!=hashmap.end()){
                if(hashmap[s[i]]!=t[i])return false;
            }
            else hashmap[s[i]]=t[i];
        }
        for(int i=0;i<t.size();i++){
            auto it=t2s.find(t[i]);
            if(it!=t2s.end()){
                if(t2s[t[i]]!=s[i])return false;
            }
            else t2s[t[i]]=s[i];
        }
        return true;
    }
};

8.两个列表的最小索引总和

题目链接:力扣599  

解题代码:

class Solution {
public:
    vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
unordered_map<string,int>hashmap;
        vector<pair<int,string>>res;
        for(int i=0;i<list1.size();i++){
            hashmap[list1[i]]=i;
        }
        for(int i=0;i<list2.size();i++){
            auto it=hashmap.find(list2[i]);
            if(it!=hashmap.end())res.push_back(make_pair(i+hashmap[list2[i]],list2[i]));
        }
        int index=0;
        for(int i=1;i<res.size();i++){
            if(res[i].first<res[index].first)index=i;
        }
        vector<string>result;
        for(int i=0;i<res.size();i++){
            if(res[i].first==res[index].first)result.push_back(res[i].second);
        }
        return result;
    }
};

9.字符串中的第一个唯一字符

题目链接:力扣387

解题代码:

class Solution {
public:
    int firstUniqChar(string s) {
unordered_map<char,int>hashmap;
        for(int i=0;i<s.size();i++){
            auto it=hashmap.find(s[i]);
            if(it!=hashmap.end())++hashmap[s[i]];
            else hashmap[s[i]]=1;
        }
        for(int i=0;i<s.size();i++){
            if(hashmap[s[i]]==1)return i;
        }
        return -1;
    }
};

10.两个数组的交集(II)

题目链接:力扣350

解题代码:

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int,int>hashmap;
        vector<int>result;
        for(int i=0;i<nums1.size();i++){
            hashmap[nums1[i]]++;
        }
        for(int i=0;i<nums2.size();i++){
            auto it=hashmap.find(nums2[i]);
            if(it!=hashmap.end()){
                if(hashmap[nums2[i]]>0){result.push_back(nums2[i]);
            --hashmap[nums2[i]];
                                        }
            }
        }
        return result;
    }
};

11.存在重复的元素

题目链接:力扣219

解题代码:

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int>hashmap;
    for(int i=0;i<nums.size();i++){
        auto it=hashmap.find(nums[i]);
        if(it!=hashmap.end()){
            if(i-hashmap[nums[i]]<=k)return true;
            
        }
         hashmap[nums[i]]=i;
    }
        return false;
        
    }
};

12.字母异位词分组 

题目链接:力扣49

解题代码:

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string>>hashmap;
        for(int i=0;i<strs.size();i++){
            string key=strs[i];
            sort(key.begin(),key.end());
            hashmap[key].push_back(strs[i]);
        }
        vector<vector<string>>ans;
        for(auto it=hashmap.begin();it!=hashmap.end();it++){
            ans.push_back(it->second);
        }
        return ans;
    }
    
};

已知乾坤大,犹怜草木青。这里北风,星河辽阔,一路相伴!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值