LeetCode 之 Pow(x, n)(分治法)

【问题描述】

Implement pow(x, n).

1.【基础知识】

1)分治的意识,一道O(N)的算法题,琢磨出O(lgN)的思想出来就是要求;

2.【屌丝代码】

卡壳的地方:

1.Time Limit Exceeded。

#include <vector>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std; 

// Status: Time Limit Exceeded
class Solution {
public:
    double myPow(double x, int n) {
		double res(1);
		if(n==0)
			return 1;
        for(int i=0;i<n;i++)
			res = res*x;
		return res;
    }
};

int main()
{
	int n=1;
	double x = 2.0;
	Solution mySln;
	double num = mySln.myPow(x, n);
	cout<<num<<endl;
	while(1);
    return 0;
}

3.【源码AC】

//LeetCode, Pow(x, n)
// 二分法, $ x^n = x^{n/2} * x^{n/2} * x^{n\%2} $
// 时间复杂度 O(logn),空间复杂度 O(1)
class Solution {
public:
    double myPow(double x, int n) {
        if (n < 0)
            return 1.0 / power(x, -n);
        else
            return power(x, n);
        }
private:
    double power(double x, int n) {
        if (n == 0)
            return 1;
        double v = power(x, n / 2);
        if (n % 2 == 0)
            return v * v;
        else
            return v * v * x;
    }
};

4.【复盘】

1)卡壳部分

O(N)与O(lgN)的茶具

2)AC源码思想——二分(分治思想)

二分法: xn = x^n/2 × x^n/2 × x^n%2

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 14:06:10

LeetCode 之 Pow(x, n)(分治法)的相关文章

【leetcode 分治法】Pow(x, n)与Sqrt(x)函数的实现

</pre>Pow(x, n)</h1><h1><span style="color:#3333ff;">1.分析</span></h1><div><span style="font-size:18px;">函数原型double pow(double x, int n),实现求x的n次方.</span></div><div><sp

LeetCode 240. 搜索二维矩阵 II (C#实现)——二分查找,分治法

问题:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/ 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18,

LeetCode刷题总结-双指针、位运算和分治法篇

本文总结LeetCode上有关双指针.位运算和分治法的算法题,推荐刷题总数14道.具体考点分析如下图: 一.双指针 1.字符串和数组问题 题号:424. 替换后的最长重复字符,难度中等 题号:828. 独特字符串,难度困难 题号:923. 三数之和的多种可能,难度中等 2.实际场景应用问题 题号:826. 安排工作以达到最大收益,难度中等 3.元素对问题 题号:986. 区间列表的交集,难度中等 二.位运算 1.字符串和数组问题 题号:137. 只出现一次的数字 II,难度中等 题号:318.

Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)

1.问题描述 写一个高效的算法,从一个m×n的整数矩阵中查找出给定的值,矩阵具有如下特点: 每一行从左到右递增. 每一列从上到下递增. 2. 方法与思路 2.1 二分查找法 根据矩阵的特征很容易想到二分法,但是这是一个二维的矩阵,如何将问题转化为一维是关键.实际上我们可以根据矩阵的第一列确定值可能所在的行的范围(limu,limd),其中limu=0,使得matrix[0][0]≤matrix[i][0]≤matrix[limd][0],i∈[0,limd].而确定limd的值可以使用二分法.

leetcode 23. Merge k Sorted Lists(堆||分治法)

Merge k sorted linked lists and return it as one sorted list. 题意:把k个已经排好序的链表整合到一个链表中,并且这个链表是排了序的. 题解:这是一道经典好题,值得仔细一说. 有两种方法,假设每个链表的平均长度是n,那么这两种方法的时间复杂度都是O(nklogk). 方法一: 基本思路是:把k个链表开头的值排个序,每次取最小的一个值放到答案链表中,这次取完之后更新这个值为它后面的一个值.接着这么取一直到全部取完.那么每次更新之后怎么对当

分治法-最近距离问题Java实现

分治算法,有很多典型的问题,如最近点问题.线性选择问题.整数划分问题.大整数成绩问题.棋盘覆盖问题.循环赛日程表.二分搜索.Strassen矩阵乘法.汉诺塔等.准备花些时间逐个解决这些问题,并用Java实现,从最近点问题开始.网上找到一些代码,标题如"java 用蛮力法和分治法求解最近对有关问题",虽然体现了分治,但划分不够彻底,因此我重新对其进行了实现. 一.基本思想及策略: 首先,说说分治的思想.分治, "分而治之",就是把一个复杂的问题分成两个或更多的相同或相

分治法(二)

参考  <算法设计与分析> 第四章 分治法     Anany Levitin著  翻译版   清华大学出版社 在上一篇文章中,介绍了分治策略的思想,主定理,以及几个用分治策略的经典案例.这一篇文章将继续探讨分治算法的其他应用,包括大整数乘法和Strassen矩阵乘法,最近点对问题和凸包问题这4个算法,一般来说常规的数据结构教程上不包括这些内容. --------------------------------------------------------------------------

[算法]:分治法-求大整数相乘

#问题大整数相乘 #思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持**"无限精度"的整数,**一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 51872581574157002360341697913

HDU ACM 1007 Quoit Design 分治法求最近点对

题意:给n个点的坐标,求距离最近的一对点之间距离的一半. 分析:分治法求最近点对. #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define N 100005 double min(double a,double b) { return a<b?a:b; } struct POINT { double x,y; }; POINT point[N],*px[

[LeetCode] 50. Pow(x, n) Java

题目: Implement pow(x, n). Example 1: Input: 2.00000, 10 Output: 1024.00000 Example 2: Input: 2.10000, 3 Output: 9.26100 题意及分析:实现求x的n次方,使用分治法,复杂度降低到log2n 代码: public class Solution { public double myPow(double x, int n) { if(n < 0) return 1/pow(x,-n); e