【2020.5.11今日编程】LeetCode 50.Pow(x,n) +LeetCode 64.最小路径和 + LeetCode 31.下一个排列

LeetCode 50. Pow(x, n)

中等

  • 题目:实现 pow(x, n) ,即计算 x 的 n 次幂函数。
    注意:n 是 32 位有符号整数,其数值范围是:
    [−2 ^ 31, 2 ^ 31 − 1] 。

  • 示例

输入: 2.00000, 10
输出: 1024.00000

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

  • 方法:快速幂+迭代+ 二进制法。(这题真的我以为很简单,结果全是坑,做了好久------)
  • cpp代码实现
class Solution
{
     
	public:
		double myPow(double x, int n) 
		{
     
			if(n == 0)
				return 1.0;
			long N = abs(n);
			double temp = x;
			double res = 1.0;
			while(N > 0)
			{
     
				if(N & 1 == 1)
					res *= temp;
				temp *= temp;
				N = N >> 1;
			}
			return n > 0 ? res : 1/res;
		}
};

LeetCode 64.最小路径和

中等

  • 题目:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
    说明:每次只能向下或者向右移动一步。

  • 示例

输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

  • 方法:动态规划(真的重要!!!)。
  • cpp代码实现
class Solution
{
     
	public:
	int minPathSum(vector<vector<int>>& grid) 
	{
     
		if(grid.empty())
			return 0;
		int m = grid.size();
		int n = grid[0].size();
		vector<vector<int>>dp(m, vector<int>(n));
		for(int i = 0; i < m; ++i)
		{
     
			for(int j = 0; j < n; ++j)
			{
     
				if(i == 0 && j == 0)
					continue;
				else if(i == 0)
					dp[i][j] += dp[i][j - 1];
				else if(j ==0)
					dp[i][j] += dp[i - 1][j];
				else 
					dp[i][j] += min(dp[i - 1][j], dp[i][j - 1]);
			}
		}
		return dp[m - 1][n - 1];
	}
};

LeetCode 31.下一个排列

中等

  • 题目:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
    如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
    必须原地修改,只允许使用额外常数空间。

  • 示例

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

  • 方法:就是数字的比较和交换(发现好多题真的就是要归纳总结,然后才有思路,有一个聪明的大脑很重要)。
  • cpp代码实现
class Solution
{
     
	publicvoid nextPermutation(vector<int>& nums)
	 {
     
	 	if(nums.size() <= 1)
	 		return;
	 	int j = nums.size() - 1;
	 	while(j - 1 >= 0 && nums[j - 1] > nums[j])
	 		--j;
	 	if(j == 0)
	 		sort(nums.begin(), nums.end());
	 	else if(j > 0)
	 	{
     
	 		sort(nums.begin() + j, nums.end());
	 		for(int i = j ; i < nums.size(); ++i)
	 		{
     
	 			if(nums[i] > nums[j - 1])
	 			{
     
	 				swap(nums[i], nums[j - 1]);
	 				break;
	 			}
	 		}
	 	}
	 }
};

写在最后
我发现一个特别好的方法,就是不开心的时候,就可以看看自己以前发的朋友圈或者一些记录美好生活的账号,看的时候,想起那么美好的回忆,就会不自觉的觉得开心笑出声来,然后就觉得生活依旧很美好,身边还有很多爱你的人呐,哈哈哈哈~~~~~~~

你可能感兴趣的:(leetcode,c++,算法)