相信我,我会永远坚持下去的!
目录
第一题:两个数组的交集(力扣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;
}
};
已知乾坤大,犹怜草木青。这里北风,星河辽阔,一路相伴!