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

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

原文地址:https://www.cnblogs.com/LCCRNblog/p/5170718.html