力扣hot100刷题day1
1两数之和
方法一:暴力穷举
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
双层循环遍历数组,当两个元素之和等于target,直接放入结果数组中 On^2
vector<int> twoSum(vector<int>& nums, int target) {vector<int>res;for(int i=0;i<nums.size()-1;i++){for(int j=i+1;j<nums.size();j++){if(nums[i]+nums[j]==target){res.push_back(i);res.push_back(j);return res;}}}return res;}
方法二:使用哈希表存储
哈希表结构 元素值--下标(方便根据元素值去寻找下标)
遍历数组,如果对于当前数组,其target-值存在哈希表中,那么就直接返回当前数据的下标以及在哈希表中另一半的下标。如果不在,就将这个值直接插入insert到哈希表中,方便后续检验。
vector<int> twoSum(vector<int>& nums, int target) {vector<int>res;unordered_map<int,int>mm;for(int i=0;i<nums.size();i++){if(mm.count(target-nums[i])==0){mm.insert({nums[i],i});}else{res.push_back(i);res.push_back(mm[target-nums[i]]);return res;}}return res;}
一些哈希表常用操作
ordered_map<int,int>mm;
①插入元素
mm.insert({nums[i],i});
②查找某个元素在哈希表中是否存在
mm.count(target-nums[i])==0/!=0
49字母异位词分组
给定一系列字符串数组,如何从其中找到顺序不一样但含有元素以及每个元素个数一样的字符串组并输出呢?
遍历数组,对于当前字符串排序,以排序后的字符串作为键,原始的字符串加入到值中。重复这样的操作,之后,直接遍历哈希表,输出其中所有的value即可。
vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>>mm;for(int i=0;i<strs.size();i++){string str=strs[i];// 就相当于sort(str.begin(), str.end()) 对字符串从头到我排序。ranges::sort(str);//将str原始元素排序,得到最终的mm[str].push_back(strs[i]);}//得到最终的键值对情况vector<vector<string>>res;for(auto& [_,value]:mm){res.push_back(value);}return res;}
128最长连续序列
给定一个数字数组,希望找到其中的最长数字连续序列
方法一(mine)
先对数组进行从小到大的排序,在遍历数组时,判断依据是比较相邻两个数据的插值是否等于1,等于等于1,序列数加一。
但是注意,可能会出现重复的数字,因此更全面的思考是如果差值等于0,接着遍历,不同之处在于序列数不变。(但时间复杂度不满足要求)
int longestConsecutive(vector<int>& nums) {//将数组排序 排序后遍历得到最大的连续数字序列长度sort(nums.begin(),nums.end());int i=0;int max=0;if(nums.size()==0)return 0;if(nums.size()==1 )return 1;while(i<nums.size()-1){int count =1;while( i<nums.size()-1&& (nums[i]==nums[i+1]-1 || nums[i]==nums[i+1])){if(nums[i]==nums[i+1]-1)count++;i++;}max=(max>count)?max:count;i++;}return max;}
方法二:
int longestConsecutive(vector<int>& nums) {unordered_set<int> us(nums.begin(),nums.end());int res=0;for(int x:us){if(us.contains(x-1)){continue;}int y=x+1;while(us.contains(y)){y++;}res=max(res,y-x);}return res;}
283 移动零
给定一个数组,如何将其中的0都移动到数组的后端而不影响其他数据的顺序
例如[1,2,0,3,0,12] [1,2,3,12,0,0] 但同时不能使用额外的空间进行
使用双指针
指针a b均是在数组的最初位置。比较(近似于a是慢指针,b是快指针)
如果a b均不为零 则两者都往后移动
如果a b均为零 则a不动 b向后移动
如果a为0 但b不为零 则b的值移动到a处,b处的值变成0 接着都往后移动
void moveZeroes(vector<int>& nums) {//双指针int i=0;int j=0;while(i!=nums.size()){if (nums[j]!=0&& nums[i]!=0){i++;j++;}else if(nums[j]==0 && nums[i]==0){i++;}else if (nums[j]==0 && nums[i]!=0){nums[j]=nums[i];nums[i]=0;i++;j++;}}}
是否会出现a不为0但b为0的情况呢?不会因为首先慢指针一定在快指针后方,另外,慢指针后面要么是快指针,要么就是0,就不会出现这样的情况。