zoukankan      html  css  js  c++  java
  • Leetcode题解(十七)

    48、Rotate Image

    题目:

    分析:题目意思很简单,就是将一个n*n的矩阵顺时针旋转90度。

    这道题难度不大,按照旋转的过程走一遍即可。代码如下:

     1 class Solution {
     2 public:
     3     void rotate(vector<vector<int>>& matrix) {
     4         vector<vector<int>> temp;
     5         const int size = matrix.size();
     6         
     7         temp.resize(size);
     8         int i,j,k;
     9         for(i=0;i<size;i++)
    10         {
    11             temp[i].resize(size);
    12         }
    13         k=size-1;
    14         for(i=0;i<size;i++)
    15         {
    16             for(j=0;j<size;j++)
    17             {
    18                 temp[j][k] = matrix[i][j];//把一行赋值给temp的一列
    19             }
    20             k--;
    21         }
    22         matrix = temp;
    23     }
    24 };

     ---------------------------------------------------------------------------分割线---------------------------------------------------------------------

    49、Group Anagrams

    题目:

    分析:这道题目需要将给定的字符串进行分类。在算法课上,有一种比较经典的算法就是“指纹”算法,将每一个需要被分类的元素求指纹,指纹相同的归为一类。指纹算法中,需要注意的是,指纹相同的元素并不一定是满足要求的同一类元素,指纹不同的元素一定不是同一类元素。比如这道题目中,我可以把每一个字符串的字符相加,相加得到的结果作为字符串的指纹。对指纹相同的字符串,可以多次求指纹,求指纹的方法可以不同,如果每次求指纹得到的结果都一样,则可以认为这两个字符串是同一类,这种算法虽然不是确切算法,多次求指纹可以将误差减小到很小。

    代码如下:

     1 class Solution {
     2 public:
     3     vector<vector<string>> groupAnagrams(vector<string>& strs) {
     4         vector<string> temp;
     5         vector< vector<string> > res;
     6         
     7         const int size = strs.size();
     8         bool flag[size];
     9         memset(flag,size,sizeof(char));
    10         int mode,finger;
    11         for(int i=0;i<size;i++)
    12         {
    13             if(flag[i] == 0)
    14             {
    15                 flag[i]=1;
    16                 mode = FingerPrint(strs[i]);
    17                 temp.clear();
    18                 temp.push_back(strs[i]);
    19                 for(int j=i+1;j<size;j++)
    20                 {
    21                     finger = FingerPrint(strs[j]);
    22                     if(finger == mode)
    23                     {
    24                         if(isSame(strs[i],strs[j]))
    25                         {
    26                             temp.push_back(strs[j]);
    27                             flag[j]=1;
    28                         }
    29                             
    30                     }
    31                 }
    32             }
    33             sort(temp.begin(),temp.end());
    34             res.push_back(temp);    
    35             
    36         }
    37         return res;
    38     }
    39     
    40     int FingerPrint(string str)
    41     {
    42         int total = 0;
    43         int i;
    44         for(i=0;i<str.length();i++)
    45         {
    46             total +=str[i];
    47         }
    48         return total;
    49     }
    50     bool isSame(string mode,string finger)
    51     {
    52         set<char> st1;
    53         set<char> st2;
    54         int i;
    55         for(i=0;i<mode.length();i++)
    56         {
    57             st1.insert(mode[i]);
    58         }
    59         for(i=0;i<finger.length();i++)
    60         {
    61             st2.insert(finger[i]);
    62         }
    63         return st1 == st2;
    64     }
    65 };

    提交时间超限了,说明算法复杂度太高,不能满足题目要求,需要进一步改进算法,优化算法。

    在网上看了一下别人的解题思路,可以为每一类字符串建立一个hash表,key值为这一类字符串的字符按照字典顺序排列的字符串。

    代码如下:

     1 class Solution {
     2 public:
     3     vector<vector<string>> groupAnagrams(vector<string>& strs) {
     4         vector<string> temp;
     5         vector< vector<string> > res;
     6         
     7         map<string,vector<string>> myMap;
     8         const int size = strs.size();
     9         //sort(strs.begin(), strs.end());
    10         for(int i=0;i<size;i++)
    11         {
    12             myMap[getStr(strs[i])].push_back(strs[i]);
    13         }
    14         for(map<string, vector<string>>::iterator it =myMap.begin();it != myMap.end();it++)
    15         {
    16             sort(it->second.begin(),it->second.end());//如果事先已经对strs排序,这一步就不需要了
    17             res.push_back(it->second);
    18         }
    19         return res;
    20     }
    21     string getStr(string str)
    22     {
    23         sort(str.begin(),str.end());
    24         return str;
    25     }
    26 };

     -------------------------------------------------------------------------分割线----------------------------------------------------------------------

    50、Pow(x,n)

    题目:

    题目要求计算x的n次,也就是一个数学运行,只是需要考虑很多的边界问题。在网上找了一些有关幂运算的详解,链接http://blog.csdn.net/fengbingyang/article/details/12236121

    这一篇博客对幂运算做了比较详细的说明,代码也很简单,在理解算法的基础上很容易的实现。

  • 相关阅读:
    RDIFramework.NET ━ .NET快速信息化系统开发框架钜献 V2.9 版本震撼发布
    免费的海量编程中文书籍索引-都是干货【强烈建议收藏】
    SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
    实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web
    RDIFramework.NET 框架之组织机构权限设置
    实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-WinForm
    RDIFramework.NET ━ 9.16 案例模块━ Web部分
    RDIFramework.NET ━ 9.15 个性化设置 ━ Web部分
    RDIFramework.NET ━ 9.14 数据库连接管理 ━ Web部分
    RDIFramework.NET ━ 9.13 系统日志与系统异常管理 ━ Web部分
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/5170718.html
Copyright © 2011-2022 走看看