算法练习LeetCode初级算法之动态规划
爬楼梯:斐波那契数列
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
非递归解法
class Solution {
public int climbStairs(int n) {
if (n==1) {
return 1;
}
if (n==2) {
return 2;
}
int n1=1,n2=2;
for (int i = 0; i <n-2; i++) {
int m=n1+n2;
n1=n2;
n2=m;
}
return n2;
}
}
递归解法
class Solution {
int[] result=null;
public int climbStairs(int n) {
result=new int[n+1];
Arrays.fill(result, -1);
f(n);
return result[n];
}
private void f(int X) {
if (result[X]!=-1) {
return;
}
if (X==0||X==1) {
result[X]=1;
return;
}
f(X-1);
f(X-2);
result[X]=result[X-1]+result[X-2];
}
}
买卖股票的最佳时机
重点是要设置一个最小值和一个最大值,并且不断替换!
class Solution {
public int maxProfit(int[] prices) {
if (prices.length==0||prices.length==1) {
return 0;
}
int minPrice=prices[0];
int maxPrice=0;
for (int i = 0; i < prices.length; i++) {
if (prices[i]<=minPrice) {
minPrice=prices[i];
}else if ((prices[i]-minPrice)>maxPrice) {
maxPrice=prices[i]-minPrice;
}
}
return maxPrice;
}
}
最大子序和
超出时间限制的解法
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length==0) {
return 0;
}
if (nums.length==1) {
return nums[0];
}
int sum=0;
Set<Integer> list=new TreeSet<>();
int n=1;
while (n<=nums.length) {
for (int i = 0; i < nums.length-n+1; i++) {
int m=0;
for (int j = 0; j < n; j++) {
m+=nums[i+j];
}
list.add(m);
}
n++;
}
int res=0;
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
res= (Integer) iterator.next();
}
return res;
}
}
优化解法
没想到可以这样解,厉害!找个例子试一试就懂了
class Solution {
public int maxSubArray(int[] nums)
{
if (nums.length==0) {
return 0;
}
if (nums.length==1) {
return nums[0];
}
int max=nums[0];
int sum=0;
for (int i = 0; i < nums.length; i++) {
if (sum>0) {
sum+=nums[i];
}else {
sum=nums[i];
}
max=Math.max(max, sum);
}
return max;
}
}
更简单的解法:找最大子序列,最重要的要分清正负!!!
class Solution {
public int maxSubArray(int[] nums)
{
int max=nums[0];
int sum=nums[0];
for (int i = 1; i < nums.length; i++) {
sum=Math.max(sum+nums[i], nums[i]);
max=Math.max(max, sum);
}
return max;
}
}
打家劫舍
挺难的,参考别人的解法,先记住
递归法
class Solution {
//测试2,1,1,2
private int[] memo;
public int rob(int[] nums) {
memo=new int[nums.length];
Arrays.fill(memo, -1);
return tryRob(nums, 0);
}
private int tryRob(int[] nums,int index) {
if (index>=nums.length) {
return 0;
}
if (memo[index]!=-1) {
return memo[index];
}
int res=0;
for (int i = index; i < nums.length; i++) {//循环每次后移,即可以跳过(相隔)两个或多个
res=Math.max(res, nums[i]+tryRob(nums,i+2));
}
memo[index]=res;
return res;
}
}
动态规划
class Solution {
//测试2,1,1,2
public int rob(int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
if (n==1) {
return nums[0];
}
if (n==2) {
return Math.max(nums[0], nums[1]);
}
int[] f = new int[n];
f[0]=nums[0];
f[1]=Math.max(nums[0], nums[1]);//典型动态规划问题,先将子问题记录,然后
for (int i = 2; i < f.length; i++) {
f[i]=Math.max(f[i-2]+nums[i], f[i-1]);//这里利用子问题来解决问题
}
return f[n-1];
}
}
参考:https://blog.csdn.net/likunkun__/article/details/80724683
算法练习LeetCode初级算法之动态规划的更多相关文章
- 【LeetCode算法】LeetCode初级算法——字符串
在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...
- 算法练习LeetCode初级算法之链表
删除链表中的节点 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode ne ...
- 算法练习LeetCode初级算法之字符串
反转字符串 我的解法比较low,利用集合的工具类Collections.reverse反转,用时过长 class Solution { public void reverseString(char[] ...
- 算法练习LeetCode初级算法之数组
删除数组中的重复项 官方解答: 旋转数组 存在重复元素 只出现一次的数 官方解答: 同一个字符进行两次异或运算就会回到原来的值 两个数组的交集 II import java.util.Arr ...
- 算法练习LeetCode初级算法之其他
位1的个数 解法一: class Solution { // you need to treat n as an unsigned value public int hammingWeight(int ...
- 算法练习LeetCode初级算法之数学
Fizz Buzz class Solution { public List<String> fizzBuzz(int n) { List<String> list=new L ...
- 算法练习LeetCode初级算法之设计问题
打乱数组 不断的让第一个与后面随机选择的数交换 class Solution { private int[] nums; private int[] initnums; public Solution ...
- 算法练习LeetCode初级算法之排序和搜索
合并两个有序数组 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { System.arrayco ...
- 算法练习LeetCode初级算法之树
二叉树的前序遍历 我的解法:利用递归,自底向下逐步添加到list,返回最终的前序遍历list class Solution { public List<Integer> preorderT ...
随机推荐
- [转]Windows 经验集
Windows Server 2012 R2 显示 这台电脑 图标方法: 来自:https://jingyan.baidu.com/article/f25ef2544f6883482c1b82e5.h ...
- 廖雪峰Java9正则表达式-1正则表达式入门-1正则表达式简介
1.使用代码来判断字符串 场景: 判断字符串是否是有效的电话号码:"010-12345678", "123ABC456" 判断字符串是否是有效的电子邮箱地址:& ...
- symfony generate bundle autoload failed的解决办法
I also encountered this problem,I add new bundle namespace in composer.json"autoload": { & ...
- Egret飞行模拟-开发记录02
1.Egret异步加载资源制作loading界面 使用EUI,EXML组件制作loading界面时,需要皮肤主题资源加载控制.即default.thm.json配置文件. 下一篇专门记录这部分. 2. ...
- java 中的强制转换
强制转换分两种,一种是基础类型强制转换(Type Conversion),一种是引用类型强制转换(Class Casting):
- centos7 lnmp环境部署
搭建版本 版本组合 php5.6+apache/2.4.6(centos7)+mysql5.7.24 因为新系统不能确认哪些指令已经搭建 所以安装前需要确认下是否拥有 检测是否已经安装过Vim rp ...
- 2018-2019-2 20165205 《网络对抗》 Exp5 MSF基础
2018-2019-2 20165205 <网络对抗> Exp5 MSF基础 实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1 ...
- scrapy爬去京东书籍信息
# -*- coding: utf-8 -*- import scrapy import urllib import json from copy import deepcopy class JdSp ...
- [转]Python 的列表解析式,集合解析式,字典解析式
Python 的列表解析式,集合解析式,字典解析式 这三种都是 python 里面的语法糖. 语法糖,Syntactic Sugar,就是为了写程序时候少出错,发明的一些简便的方法,但不影响这个语法的 ...
- 升级linux python
# python -V # 查看python 版本 # cd /home/centos/Downloads # 进入存放目录 # wget https://www.python.org/ftp/pyt ...