• LEETCODE 169 189 121 122 55


    169 多数元素

    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

    你可以假设数组是非空的,并且给定的数组总是存在多数元素。

    1. class Solution {
    2. public:
    3. int majorityElement(vector<int>& nums) {
    4. sort(nums.begin(),nums.end());
    5. int size = nums.size();
    6. return nums[size/2];
    7. }
    8. };

    多数元素是指在数组中出现次数大于n/2的元素。

    众数是数组中出现次数最多的元素

    比对一下多数元素和众数这两个概念,不难发现多数元素一定是众数,并且一定是中位数

    所以就利用多数元素是中位数这个性质,对原数组进行排序,然后中间的那个数就是多数元素。

    189 轮转数组

     给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

    1. class Solution {
    2. public:
    3. void rotate(vector<int>& nums, int k) {
    4. k%=nums.size();
    5. reverse(nums.begin(),nums.end());
    6. reverse(nums.begin(),nums.begin()+k);
    7. reverse(nums.begin()+k,nums.end());
    8. }
    9. };

    这个主要是要观察,总结规律。在演草纸上写一下原数组,然后再写一下轮转后的数组,把他俩放在两行上去比对,能够总结出规律,在一个就是要知道有reverse这个方法。 

    121 买卖股票的最佳时机

    给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

    你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

    返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int length = prices.size();
    5. int current_min_price = prices[0];
    6. int current_max_value = 0;
    7. for(int i=0;i<length;++i){
    8. current_max_value = current_max_value>(prices[i]-current_min_price)?current_max_value:(prices[i]-current_min_price);
    9. current_min_price = current_min_price<prices[i]?current_min_price:prices[i];
    10. }
    11. return current_max_value;
    12. }
    13. };

    比如说一共有n天的股票价格数据,那么我们就是把所有情况分为n种,第i种表示在第i天售出股票时,所能收获的最大利润值。最后比较这n个值,取最大即可。

    具体到每一种情况时,我们已知是在第i天售出,要想要利润最大,那就是求出从第1到第i天,股票价格最低的那天是哪天,然后在那天买入即可,然后求出最大利润值。 

     122 买卖股票的最佳时机 II

    给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

    在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

    返回 你能获得的 最大 利润 。

    1. class Solution {
    2. public:
    3. int maxProfit(vector<int>& prices) {
    4. int res = 0;
    5. for(int i=1;i<prices.size();++i){
    6. if(prices[i]>prices[i-1]){
    7. res+=prices[i]-prices[i-1];
    8. }
    9. }
    10. return res;
    11. }
    12. };

    这道题用的是贪心算法,它相比于上一题,就是要寻找多个区间,使得在每个相应区间里买卖股票得到的利润值之和最大,其实这个不是很理解,比较容易理解的应该是动态规划算法。

    动态规划算法就是dp数组是二维的,第一维表示第i天,第二维表示这一天手里是否有股票。dp[i][0]:在第i天且手里没股票时的最大利润。dp[i][1]:在第i天且手里有股票时的最大利润。

    dp[i][0] = max(dp[i-1][1]+pirces[i],dp[i-1][0]);

    dp[i][1] = max(dp[i-1][0]-prices[i],dp[i-1][1])

    55 跳跃游戏

    给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

    判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

    1. class Solution {
    2. public:
    3. bool canJump(vector<int>& nums) {
    4. int size = nums.size();
    5. int max = 0;
    6. for(int i=0;i<=max;++i){
    7. max = max>(i+nums[i])?max:(i+nums[i]);
    8. if(max>=size-1){
    9. return true;
    10. }
    11. }
    12. return false;
    13. }
    14. };

     如果能够到达第i个位置,那么在第i个位置之前的所有位置都可以到达!

    所以只需要遍历一遍数组,看看能到的最远的位置是哪就行。

  • 相关阅读:
    达梦数据库表空间管理常用SQL
    Ubuntu安装SVN服务并结合内网穿透实现公网访问本地存储文件
    工作汇报
    sd-wan专线异地组网|分支机构与总部间外贸MES系统高速访问解决方案
    线扫相机设置编码器触发
    nginx 配置反向代理
    yum | dnf命令打补丁-升级安装包
    分布式集群理论
    数组——螺旋矩阵II
    Configuring HSRP(Hot Standby Routing Protocol)
  • 原文地址:https://blog.csdn.net/peanutpeanuta/article/details/133019253