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