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

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

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 { };
       
   }
};
相关推荐
网易独家音乐人Mike Zhou2 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
搬砖的小码农_Sky5 小时前
C语言:数组
c语言·数据结构
Swift社区6 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman6 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
先鱼鲨生6 小时前
数据结构——栈、队列
数据结构
一念之坤6 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
IT 青年7 小时前
数据结构 (1)基本概念和术语
数据结构·算法
熬夜学编程的小王7 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
Dong雨7 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna7 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie