LEETCODE 169 189 121 122 55

169 多数元素

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

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

class Solution {
public:
    int majorityElement(vector& nums) {
        sort(nums.begin(),nums.end());
        int size = nums.size();
        return nums[size/2];
    }
};

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

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

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

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

189 轮转数组

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

class Solution {
public:
    void rotate(vector& nums, int k) {
        k%=nums.size();
        reverse(nums.begin(),nums.end());
        reverse(nums.begin(),nums.begin()+k);
        reverse(nums.begin()+k,nums.end());
    }
};

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

121 买卖股票的最佳时机

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

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

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

class Solution {
public:
    int maxProfit(vector& prices) {
        int length = prices.size();
        int current_min_price = prices[0];
        int current_max_value = 0;
        for(int i=0;i(prices[i]-current_min_price)?current_max_value:(prices[i]-current_min_price);
            current_min_price = current_min_price

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

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

 122 买卖股票的最佳时机 II

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

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

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

class Solution {
public:
    int maxProfit(vector& prices) {
        int res = 0;
        for(int i=1;iprices[i-1]){
            res+=prices[i]-prices[i-1];
            }
        }
        return res;
    }
};

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

动态规划算法就是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 。

class Solution {
public:
    bool canJump(vector& nums) {
        int size = nums.size();
        int max = 0;
        for(int i=0;i<=max;++i){
            max = max>(i+nums[i])?max:(i+nums[i]);
            if(max>=size-1){
                return true;
            }
        }
        return false;
    }
};

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

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

你可能感兴趣的:(数据结构,算法)