LeetCode 分治篇(50、17)
50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
思路
//确定边界,n可以为负数
//暴力法
//分治(幂运算)
//迭代(幂运算),牛顿迭代法
solution 1 暴力
//超时
class Solution {
public double myPow(double x, int n) {
double re = 1;
if (n<0){
for (int i = 0; i <-n;i++){
re = re*(1/x);
}
}
if (n>0){
for (int i = 0; i<n; i ++){
re = re*x;
}
}
return re;
}
}
solution2 分治(幂运算)
//时间复杂度(logN)
class Solution {
public double myPow(double x, int n) {
return n>=0 ? helper(x,n):1.0/helper(x,-n);
}
public double helper(double x, int n){
if (n==0) return 1.0;
//下一层,子问题
double re = helper(x,n/2);
return n%2==0 ? re*re : re*re*x;
}
}
solution3 迭代
//-n必须为long类型
class Solution {
public double myPow(double x, int n) {
long N = n;
return n >= 0?helper(x,N):1.0/helper(x,-N);
}
public double helper(double x, long n){
double res = 1.0;
double contribute = x;
while (n>0){
if (n%2 == 1){ //为奇数时要多乘一个本身
res *= contribute;
}
contribute *= contribute; //下一次要迭代的
n /= 2;
}
return res;
}
}
17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
solution1递归回溯
//时间复杂度为3^N*4^M (n+m=digits.length())
class Solution {
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList();
if (digits == null || digits.equals("")) return ans;
Map<Character, String> map = new HashMap<Character,String>();
map.put('2',"abc");
map.put('3',"def");
map.put('4',"ghi");
map.put('5',"jkl");
map.put('6',"mno");
map.put('7',"pqrs");
map.put('8',"tuv");
map.put('9',"wxyz");
helper(digits,ans,"",map,0);
return ans;
}
public void helper(String digits,List<String> ans,String curr,
Map<Character,String> map,int index){
//终止条件
if (index == digits.length()) {
ans.add(curr);
return;
}
//当前层,下一层
String letters = map.get(digits.charAt(index));
for (int i = 0;i < letters.length();i++){
helper(digits,ans,curr+letters.charAt(i),map,index+1);
}
}
}
//总结
// String判空 str==null || str.equals("")
// list转String String join = String.join(",", list);
// char[]转String String str = String.valueOf(cha);
// String转char[] char[] cha = String.toCharArray();
// String转char char c = String.charAt( index );
solution2 队列
class Solution {
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList();
if (digits == null || digits.equals("")) return ans;
Map<Character, String> map = new HashMap<Character,String>();
map.put('2',"abc");
map.put('3',"def");
map.put('4',"ghi");
map.put('5',"jkl");
map.put('6',"mno");
map.put('7',"pqrs");
map.put('8',"tuv");
map.put('9',"wxyz");
ans.add("");
for (int i=0; i<digits.length(); i++){
String letters = map.get(digits.charAt(i));
int size = ans.size(); //数组长度计算不能放在for循环里,长度会一直变化
for (int j=0; j < size;j++){
String str = ans.remove(0);//队列弹出第一个元素
for (int k = 0; k < letters.length(); k++){
ans.add(str+letters.charAt(k));
}
}
}
return ans;
}
}
LeetCode 分治篇(50、17)的更多相关文章
- ETL工具--kettle篇(17.10.09更新)
ETL是EXTRACT(抽取).TRANSFORM(转换).LOAD(加载)的简称,实现数据从多个异构数据源加载到数据库或其他目标地址,是数据仓库建设和维护中的重要一环也是工作量较大的一块.当前知道的 ...
- 经典面试题sql基础篇-50常用的sql语句(有部分错误)
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...
- mysql 开发进阶篇系列 17 MySQL Server(key_buffer与table_cache)
一.key_buffer 上一篇了解key_buffer设置,key_buffer_size指定了索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度.通过检查状态值Key_read_reque ...
- LeetCode 分治算法
分治算法:是将问题划分为一些独立的子问题,递归的求解个子问题,然后合并子问题的解而得到原问题的解. 分治算法步骤 step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题: ...
- 面试之leetcode分治-求众数,x幂等
1 leetcode50 计算 x 的 n 次幂函数. 实现 pow(x, n) ,即计算 x 的 n 次幂函数. (1)调用库函数 (2)暴力o(N) (3)分治 xxxxxx.......x ...
- leetcode.分治.241为运算表达式设计优先级-Java
1. 具体题目 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输入: & ...
- leetcode 签到 面试题 17.16. 按摩师 动态规划
题目: 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接.在每次预约服务之间要有休息时间,因此她不能接受相邻的预约.给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长 ...
- [LeetCode]剑指 Offer 17. 打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7, ...
- DLL 生成与使用的全过程(2010-01-18 14:50:17)
转载自 水滴的博客http://blog.sina.com.cn/spiritofwater 个人学习用 转载▼ 分类: 技术 由dll导出的lib文件: 包含了每一个dll导出函数的符号名和 ...
- shamir叠像术 分类: 图像处理 2015-07-08 16:50 17人阅读 评论(1) 收藏
K=imread('SHNU.bmp'); height=info.Height; width=info.Width; A=zeros(height,width); B=zeros(height,wi ...
随机推荐
- 如何使用Arduino创建摩尔斯电码生成器
摩尔斯电码工作原理 摩尔斯电码发明于19世纪,使用非常简单的长短脉冲序列(通常为电和划)来远距离发送消息.通过将字母表中的字母编码为电和划的组合,信息可以只用一个单一的电子或声音信号来表达. 为了说明 ...
- CSS 多行文本超链接下划线动效
先看效果 乍一看,是不是感觉很简单,仔细一瞅发现事情好像没有那么简单. 如果十分钟还没想出怎么实现,那就把简历上的"精通css"改成"了解css"-- 大部分人 ...
- Newstar CTF 2023
WEEK1 PWN 1.ezshellcode 直接sendline(shellcode)即可 exp: from pwn import * p = remote("node4.buuoj. ...
- unity利用Rigibody实现第一人称移动
1. CameraRotation脚本,将它给MainCamera,实现上下视角旋转 using System.Collections; using System.Collections.Generi ...
- html部分兼容性总结
部分兼容性总结一下: 1.background-color的兼容性: 火狐正常,可以同时在后面加上!important(只有火狐识别,其他的不识别,火狐优先,位置必须放在开头). IE,谷歌,360, ...
- 每天5分钟复习OpenStack(七)内存虚拟化
标题中的存储虚拟化,涉及到两个方面,分别是内存和磁盘的虚拟化技术.内存的虚拟化就不得不提EPT和VPID 技术. 首先申明下本人其实不想写一些纯理论的东西,但是架不住面试经被问,为此特将一些特别复杂的 ...
- java泛型<? extends E>和<? super E>的区别和适用场景
<? extends E>是Upper Bound(上限)的通配符,用来限制元素类型的上限,如: List<? extends Fruit> fruits; 表示集合中的元素的 ...
- sed 原地替换文件时遇到的趣事
哈喽大家好,我是咸鱼 在文章<三剑客之 sed>中咸鱼向大家介绍了文本三剑客中的 sed sed 全名叫 stream editor,流编辑器,用程序的方式来编辑文本 那么今天咸鱼打算讲一 ...
- idea的mybatis插件free mybatis plugin(或 Free MyBatis Tool),很好用
为大家推荐一个idea的mybatis插件----free mybatis plugin(或 Free MyBatis Tool),很好用(个人觉得free mybatis plugin更好用一点,可 ...
- Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
在windows中使用命令行方式安装IIS(Web服务器) Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x ...