Leetcode题解(十七)
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题解(十七)的更多相关文章
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
- 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
- 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
- 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
- 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...
- 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...
- 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)
目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 github. 描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回 ...
随机推荐
- CSS3的颜色渐变效果
在 animate.css寻找自己想要的动态效果,看到标题Animate.css和按钮Animate it的颜色在逐渐变化,觉得蛮有趣的,把控制变化的相关代码扒了下来,自己分析实现一波. 一开始认为使 ...
- 你的专属定制——JQuery自定义插件
前 言 絮叨絮叨 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗 ...
- NSTimer、CADisplayLink 内存泄漏
NSTimer.CADisplayLink 内存泄漏 内存泄漏的原因 CADisplayLink 要用 Taget 和 Selector 初始化,NSTimer 也可以用类似的方法初始化.这样初始化之 ...
- PuTsangTo
一. 跳跃与移动的优化与完善 先给上一次的内容做一次补救,也就是上一次中还留存的,由于键盘按键事件的第一次回调与后续回调之间会间隔个小半秒带来的跳跃落地后动作延迟的情况. 最终的键盘按下回调的处理代码 ...
- C语言bitmap的使用技巧
bitmap是一种以位的状态来表示某种特性的状态的一种操作方式,类似嵌入式中的寄存器操作,在表示某种特性enable/disable的时候很适用且占用的内存空间也很小 比如:做过交换机或者企业网管,路 ...
- python基础之五大标准数据类型
学习一门语言,往往都是从Hello World开始. 但是笔者认为,在一个黑框框中输出一个"你好,世界"并没有什么了不起,要看透事物的本质,熟悉一门语言,就要了解其底层,就是我们常 ...
- AngularJS -- Bootstrap(启动器)(转载)
AngularJS -- Bootstrap(启动器) 点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ Bootstrap(初始化) ...
- 1.Bootstrap-简介
1.介绍 Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 2.HTML 模板 一个使用了 Boots ...
- SQL Server 2016 Alwayson新增功能
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/ 概述 SQLServer2016发布版本到现在已有一年多的时间了,目前最新的稳定版本是SP1版本.接下来就开看看2016在Alw ...
- ElasticSearch入门(3) —— head插件
#### 安装ES head插件 具体请参考github地址:https://github.com/mobz/elasticsearch-head 使用 安装Install # 在线安装head插件 ...