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

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

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 { };
       
   }
};
相关推荐
鸽鸽程序猿9 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd9 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo61713 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v18 分钟前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人1 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
忘梓.2 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
算法·动态规划
️南城丶北离2 小时前
[数据结构]图——C++描述
数据结构··最小生成树·最短路径·aov网络·aoe网络