日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode题解(十七)

發(fā)布時(shí)間:2024/4/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode题解(十七) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

48、Rotate Image

題目:

分析:題目意思很簡(jiǎn)單,就是將一個(gè)n*n的矩陣順時(shí)針旋轉(zhuǎn)90度。

這道題難度不大,按照旋轉(zhuǎn)的過(guò)程走一遍即可。代碼如下:

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 };

?---------------------------------------------------------------------------分割線(xiàn)---------------------------------------------------------------------

49、Group Anagrams

題目:

分析:這道題目需要將給定的字符串進(jìn)行分類(lèi)。在算法課上,有一種比較經(jīng)典的算法就是“指紋”算法,將每一個(gè)需要被分類(lèi)的元素求指紋,指紋相同的歸為一類(lèi)。指紋算法中,需要注意的是,指紋相同的元素并不一定是滿(mǎn)足要求的同一類(lèi)元素,指紋不同的元素一定不是同一類(lèi)元素。比如這道題目中,我可以把每一個(gè)字符串的字符相加,相加得到的結(jié)果作為字符串的指紋。對(duì)指紋相同的字符串,可以多次求指紋,求指紋的方法可以不同,如果每次求指紋得到的結(jié)果都一樣,則可以認(rèn)為這兩個(gè)字符串是同一類(lèi),這種算法雖然不是確切算法,多次求指紋可以將誤差減小到很小。

代碼如下:

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 };

提交時(shí)間超限了,說(shuō)明算法復(fù)雜度太高,不能滿(mǎn)足題目要求,需要進(jìn)一步改進(jìn)算法,優(yōu)化算法。

在網(wǎng)上看了一下別人的解題思路,可以為每一類(lèi)字符串建立一個(gè)hash表,key值為這一類(lèi)字符串的字符按照字典順序排列的字符串。

代碼如下:

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());//如果事先已經(jīng)對(duì)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 };

?-------------------------------------------------------------------------分割線(xiàn)----------------------------------------------------------------------

50、Pow(x,n)

題目:

題目要求計(jì)算x的n次,也就是一個(gè)數(shù)學(xué)運(yùn)行,只是需要考慮很多的邊界問(wèn)題。在網(wǎng)上找了一些有關(guān)冪運(yùn)算的詳解,鏈接http://blog.csdn.net/fengbingyang/article/details/12236121

這一篇博客對(duì)冪運(yùn)算做了比較詳細(xì)的說(shuō)明,代碼也很簡(jiǎn)單,在理解算法的基礎(chǔ)上很容易的實(shí)現(xiàn)。

轉(zhuǎn)載于:https://www.cnblogs.com/LCCRNblog/p/5170718.html

總結(jié)

以上是生活随笔為你收集整理的Leetcode题解(十七)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。