2021-4-21刷题(数组)

这篇博客记录了2021年4月21日的学习内容,主要围绕LeetCode上的数组题目进行讨论,包括买卖股票的最佳时机II的贪心算法和动态规划解法,以及旋转数组的暴力解法和多次逆置方法。博主在学习中实践了两种股票问题的解决方案,并对旋转数组的两种解法进行了说明。
摘要由CSDN通过智能技术生成

学习目标:

leetcode刷题

学习内容:

买卖股票的最佳时机 II
(1):贪心算法
(2):动态规划
(3):
link:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2zsx1/
旋转数组
(1):暴力解法
(2):多次逆置
(3):
link:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2skh7/

学习时间:

2021.4.21 中下午

学习产出:

(1)给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
第一种算法:(贪心算法

class Solution {
public:
    int maxProfit(vector<int>& prices) {   
        int maxprofit = 0;               //设置maxprofit为利益最大
        int n = prices.size();
        for (int i = 1; i < n; ++i) {
            maxprofit += max(0, prices[i] - prices[i - 1]);       //利用max函数避免特殊情况
        }
        return maxprofit;
    }
};

第二种算法;(动态规划) 不会

(2):给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数
eg:
在这里插入图片描述
第一种思路(超出时间限制):首先将首末置换(最后一个数用temp保存),再将其他数依次后移。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n=nums.size();
        k%=n;
        int temp1;                  //temp用于暂存nums数组最后一个数
        for(int i=0;i<k;++i)
        {
              temp1=nums[n-1];
              for(int j=n-1;j>0;--j)
              {
                  nums[j]=nums[j-1];

              }
              nums[0]=temp1;
        }

    }
};

在这里插入图片描述
第二种思路:多次使用逆转函数

void reverise(vector<int>& nums, int begin, int end)//构造逆转函数
{
    int mid = (begin + end) / 2;
    int temp;
    end--;
    for (int i = begin; i < mid; ++i)          //循环逆转每个元素
    {
        temp = nums[begin];
        nums[begin] = nums[end];
        nums[end] = nums[begin];
        end--;
        begin++;
    }
}
class Solutio {
public:
    void rotate(vector<int>& nums, int k) {//调用函数
        int n = nums.size();
        k = k % n;                 //k可能大于n
        reverise(nums, 0, n);//先全部逆转
        reverise(nums, k, n);//后半段逆转
        reverise(nums, 0, k);//前半段逆转
    }
}

第三种思路:(不会)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值