给定一个大小为
n
的数组nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋
的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
- class Solution {
- public:
- int majorityElement(vector<int>& nums) {
- sort(nums.begin(),nums.end());
- int size = nums.size();
- return nums[size/2];
- }
- };
多数元素是指在数组中出现次数大于n/2的元素。
众数是数组中出现次数最多的元素。
比对一下多数元素和众数这两个概念,不难发现多数元素一定是众数,并且一定是中位数。
所以就利用多数元素是中位数这个性质,对原数组进行排序,然后中间的那个数就是多数元素。
给定一个整数数组
nums
,将数组中的元素向右轮转k
个位置,其中k
是非负数。
- class Solution {
- public:
- void rotate(vector<int>& nums, int k) {
- k%=nums.size();
- reverse(nums.begin(),nums.end());
- reverse(nums.begin(),nums.begin()+k);
- reverse(nums.begin()+k,nums.end());
- }
- };
这个主要是要观察,总结规律。在演草纸上写一下原数组,然后再写一下轮转后的数组,把他俩放在两行上去比对,能够总结出规律,在一个就是要知道有reverse这个方法。
给定一个数组
prices
,它的第i
个元素prices[i]
表示一支给定股票第i
天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回
0
。
- class Solution {
- public:
- int maxProfit(vector<int>& prices) {
- int length = prices.size();
- int current_min_price = prices[0];
- int current_max_value = 0;
- for(int i=0;i<length;++i){
- current_max_value = current_max_value>(prices[i]-current_min_price)?current_max_value:(prices[i]-current_min_price);
- current_min_price = current_min_price<prices[i]?current_min_price:prices[i];
- }
- return current_max_value;
- }
- };
比如说一共有n天的股票价格数据,那么我们就是把所有情况分为n种,第i种表示在第i天售出股票时,所能收获的最大利润值。最后比较这n个值,取最大即可。
具体到每一种情况时,我们已知是在第i天售出,要想要利润最大,那就是求出从第1到第i天,股票价格最低的那天是哪天,然后在那天买入即可,然后求出最大利润值。
给你一个整数数组
prices
,其中prices[i]
表示某支股票第i
天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
- class Solution {
- public:
- int maxProfit(vector<int>& prices) {
- int res = 0;
- for(int i=1;i<prices.size();++i){
- if(prices[i]>prices[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])
给你一个非负整数数组
nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回
true
;否则,返回false
。
- class Solution {
- public:
- bool canJump(vector<int>& 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个位置之前的所有位置都可以到达!
所以只需要遍历一遍数组,看看能到的最远的位置是哪就行。