48、Rotate Image

题目:

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

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

 class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
vector<vector<int>> temp;
const int size = matrix.size(); temp.resize(size);
int i,j,k;
for(i=;i<size;i++)
{
temp[i].resize(size);
}
k=size-;
for(i=;i<size;i++)
{
for(j=;j<size;j++)
{
temp[j][k] = matrix[i][j];//把一行赋值给temp的一列
}
k--;
}
matrix = temp;
}
};

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

49、Group Anagrams

题目:

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

代码如下:

 class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<string> temp;
vector< vector<string> > res; const int size = strs.size();
bool flag[size];
memset(flag,size,sizeof(char));
int mode,finger;
for(int i=;i<size;i++)
{
if(flag[i] == )
{
flag[i]=;
mode = FingerPrint(strs[i]);
temp.clear();
temp.push_back(strs[i]);
for(int j=i+;j<size;j++)
{
finger = FingerPrint(strs[j]);
if(finger == mode)
{
if(isSame(strs[i],strs[j]))
{
temp.push_back(strs[j]);
flag[j]=;
} }
}
}
sort(temp.begin(),temp.end());
res.push_back(temp); }
return res;
} int FingerPrint(string str)
{
int total = ;
int i;
for(i=;i<str.length();i++)
{
total +=str[i];
}
return total;
}
bool isSame(string mode,string finger)
{
set<char> st1;
set<char> st2;
int i;
for(i=;i<mode.length();i++)
{
st1.insert(mode[i]);
}
for(i=;i<finger.length();i++)
{
st2.insert(finger[i]);
}
return st1 == st2;
}
};

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

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

代码如下:

 class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<string> temp;
vector< vector<string> > res; map<string,vector<string>> myMap;
const int size = strs.size();
//sort(strs.begin(), strs.end());
for(int i=;i<size;i++)
{
myMap[getStr(strs[i])].push_back(strs[i]);
}
for(map<string, vector<string>>::iterator it =myMap.begin();it != myMap.end();it++)
{
sort(it->second.begin(),it->second.end());//如果事先已经对strs排序,这一步就不需要了
res.push_back(it->second);
}
return res;
}
string getStr(string str)
{
sort(str.begin(),str.end());
return str;
}
};

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

50、Pow(x,n)

题目:

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

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

Leetcode题解(十七)的更多相关文章

  1. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  2. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  3. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  4. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  5. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  6. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  7. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  8. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  9. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

  10. 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)

    目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 github. 描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回 ...

随机推荐

  1. 微信开发(2)–获取access_token

    一.access_token access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保 ...

  2. Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets Guide | ApacheCN

    Spark SQL, DataFrames and Datasets Guide Overview SQL Datasets and DataFrames 开始入门 起始点: SparkSession ...

  3. js Date() 浏览器兼容问题解决

    一般 直接new Date() 是不会出现兼容性问题的,而 new Date(datetimeformatstring) 常常会出现浏览器兼容性问题,为什么,datetimeformatstring中 ...

  4. Spring 3.x 读书笔记

    第一:如果使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化 第二:如果使用ApplicationContext作为Spring Be ...

  5. pdf点击超链接后返回:alt+ 向左 /向右

    pdf点击超链接后返回:alt+ 向左 /向右

  6. Clojure——学习迷宫生成

    背景 初学clojure,想着看一些算法来熟悉clojure语法及相关算法实现. 找到一个各种语言生成迷宫的网站:http://rosettacode.org/wiki/Maze_generation ...

  7. 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    题目链接:http://codeforces.com/problemset/problem/847/I I. Noise Level time limit per test 5 seconds mem ...

  8. jquery.form.js的重置表单增加hidden重置代码

    jquery.form.js的resetForm()方法无法重置hidden元素,打开文件在1460行加上以下代码即可

  9. JS脚本检查密码强度

    <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...

  10. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...