代码随想录算法训练营第五天

● 自己看到题目的第一想法

242. 有效的字母异位词

  1. 方法:

    方法一: 暴力法

    复制代码
    1. 分别对s, t排序
    2. 遍历s与t  判断s[i]!=t[i]  返回 false  否则 返回true
  2. 思路:

  3. 注意:

  4. 代码:

cpp 复制代码
    bool cmp(char a, char b){
       return a<b;
   }

class Solution {
public:

   bool isAnagram(string s, string t) {
       int slen = s.size();
       int tlen = t.size();
       if(slen != tlen){
           return false;
       }
       sort(t.begin(), t.end(),cmp);
       sort(s.begin(), s.end(), cmp);
       for(int i= 0; i<slen; i++){
           cout<< s[i] <<endl   ;
       }
       for(int j= 0; j<tlen; j++){
           cout<< t[j] <<endl   ;
       }        
       
       for(int i= 0,j=0; i<slen,j<tlen; i++,j++){          
               if(s[i] != t[j]){
                   cout<< s[0] <<" "<<t[0]<<endl   ;
                   cout<< s[1] <<" "<<t[1]<<endl   ;
                   return false;                                
               }
           
       }return true;
       
   }
};
  1. 运行结果:

  2. 方法二:哈希表

  3. 思路:

    复制代码
    定义一个nums数组大小为26,初始值为0;
    利用nums记分别录,s中字符出现的频次, t中字符出现的频次
    若二者频次相同 则 return true  否则  return false;
  4. 注意:

  5. 代码:

cpp 复制代码
class Solution {
public:
   bool isAnagram(string s, string t) {
       int record[26]={0};
       int slen = s.size();
       int tlen = t.size();

       for(int i = 0; i<slen; i++){
           record[s[i] -'a']++;
       }

       for(int i =0; i<tlen; i++){
           record[t[i]-'a']--;
       }

       for(int i=0; i<26; i++){
           if(record[i] != 0){
               return false;
           }
       }
       return true;
   }
};
cpp 复制代码
class Solution {
public:
    bool isAnagram(string s, string t) {
        map<char, int>m;
        for(int i =0; i<s.size(); i++){
            m[s[i]]++;
        }
        for(int i=0; i<t.size(); i++){
            m[t[i]]--;
        }
        
        for (auto it = m.begin(); it != m.end(); ++it) {
            if (it->second != 0) {
                return false;
            }
        }

        //等价于
    //   for(auto it:map){
    //         if(it.second !=0){
    //             return false;
    //         }
    //     }        


        return true;
    }
};

349. 两个数组的交集

  1. 方法:哈希表

  2. 思路:

    复制代码
     该题的结果是去重的,  所以  确定使用  set  或  unordered_set
     定义  集合 res  与  s   set<int>s, res;
     将nums1  放在 set中,  set<int>s(nums1.begin(), nums2.end());
     在s中查找 nums2  是否出现在  s中,  出现则将nums2插入res中  s.find(nums2) !=s.end();
     返回  vector<int>(res.begin(), res.end())
  3. 注意:

  4. 代码:

cpp 复制代码
class Solution {
public:
   vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        set<int>s(nums1.begin(), nums1.end());  
        set<int>res;
        for(auto nums: nums2){
            if(s.find(nums) != s.end()){
                res.insert(nums);
            }
        }
        return vector<int>(res.begin(),res.end());

       
   }
};
  1. 运行结果:

第202题. 快乐数

  1. 方法二:快慢指针

  2. 思路:

    复制代码
    可能会出现的情况有两种,
    1. 一个数最终会变成1
    2. 一个数最终会陷入循环
    3. 一个数最终会变得无限大(排除这种,不可能出现这种情况)
    
    定义两个指针  fast (每次走两步)  slow(每次走一步)
    若fast  与slow  相遇   则  陷入循环  
      判断    fast==1  若是 则返回 true   否则返回false;
     若不相遇 则 fast (每次走两步)  slow(每次走一步)
  3. 注意:

  4. 代码:

cpp 复制代码
class Solution {
public:
   int getsum(int n){
       int sum =0;
       while(n){
           sum += (n%10)*(n%10);
           n = n/10;
       }
       return sum;
   }
   bool isHappy(int n) {
       int slow = n;
       int fast = getsum(n);
       while(slow != fast){
           slow = getsum(slow);
           fast = getsum(getsum(fast));

       }
       if(slow==1){
           return true;
       }
       return false;

   }
};
  1. 方法二:哈希表

  2. 思路:

    复制代码
    可能会出现的情况有两种,
    1. 一个数最终会变成1
    2. 一个数最终会陷入循环
    3. 一个数最终会变得无限大(排除这种,不可能出现这种情况)
    
    定义哈希表unordered_set<int>set
    若 set中出现sum  则返回false, 否则将sum加入到set中;
    将n赋值到下一个计算的结果    n=sum  
  3. 注意: n要更新成下个计算的结果 即n=sum

  4. 代码:

cpp 复制代码
class Solution {
public:
   bool isHappy(int n) {

       unordered_set<int>set;
       while(1){
        int x= getsum(n);
           if(set.find(x) !=set.end()){
               return false;
           }else{
               set.insert(x);
           }
           n=x;
           if(x==1){
               return true;
           }
       }
   }
       int getsum(int n){
       int sum=0;
       while(n){
 
           sum += (n%10) * (n%10);
           n=n/10;
       }
       return sum;
   }
};

1. 两数之和

  1. 方法一:哈希表

  2. 思路:

    复制代码
    定义一个unordered_map<int, int>map, 第一个是数  第二个是下标;
    在map中查找 target-nums[i]  若存在  则返回 it->second  和下标  ,否则 将nums[i]  和 i  插入map中
  3. 注意:

  4. 代码:

cpp 复制代码
class Solution {
public:
   vector<int> twoSum(vector<int>& nums, int target) {
       unordered_map<int, int>map;
       for(int i=0; i<nums.size(); i++){
           auto it = map.find(target-nums[i]);
           if(it != map.end()){
               return {it->second, i};
           }
           map.insert(pair<int, int>(nums[i], i));
       }
       return {};

   }
};
  1. 方法二:暴力法

  2. 思路:

  3. 注意:

  4. 代码:

cpp 复制代码
class Solution {
public:
   vector<int> twoSum(vector<int>& nums, int target) {
       vector<int>res;
       for(int i=0; i<nums.size(); i++){
           for(int j=i+1; j<nums.size(); j++){
               if(nums[i]+nums[j]==target){
                   // res.push_back(i);
                   // res.push_back(j);
                   res.insert(res.end(),{i,j});
                   return res;
               }
           }
       }
       return { };
       
   }
};
相关推荐
君义_noip32 分钟前
信息学奥赛一本通 1524:旅游航道
c++·算法·图论·信息学奥赛
烁34740 分钟前
每日一题(小白)动态规划篇5
算法·动态规划
独好紫罗兰42 分钟前
洛谷题单2-P5717 【深基3.习8】三角形分类-python-流程图重构
开发语言·python·算法
滴答滴答嗒嗒滴1 小时前
Python小练习系列 Vol.8:组合总和(回溯 + 剪枝 + 去重)
python·算法·剪枝
egoist20231 小时前
【C++指南】一文总结C++二叉搜索树
开发语言·数据结构·c++·c++11·二叉搜索树
lidashent1 小时前
数据结构和算法——汉诺塔问题
数据结构·算法
小王努力学编程2 小时前
动态规划学习——背包问题
开发语言·c++·学习·算法·动态规划
f狐0狸x4 小时前
【蓝桥杯每日一题】4.1
c语言·c++·算法·蓝桥杯
ん贤4 小时前
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题&题解)(C++/Java题解)
java·c语言·数据结构·c++·算法·蓝桥杯
梭七y4 小时前
【力扣hot100题】(022)反转链表
算法·leetcode·链表