您现在的位置是:主页 > news > 互联网创业有哪些项目/安卓优化大师最新版下载

互联网创业有哪些项目/安卓优化大师最新版下载

admin2025/6/20 23:11:30news

简介互联网创业有哪些项目,安卓优化大师最新版下载,网站上传图片加水印,广州做网站优化公司报价基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪…

互联网创业有哪些项目,安卓优化大师最新版下载,网站上传图片加水印,广州做网站优化公司报价基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪…

基本概念:

 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择,贪心策略使用的前提是局部最优能导致全局最优。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。

贪心算法的基本思路:

1.建立数学模型来描述问题。

2.把求解的问题分成若干个子问题。

3.对每一子问题求解,得到子问题的局部最优解。

4.把子问题的解局部最优解合成原来解问题的一个解。

实现框架:

从问题的某一初始解出发;

while (能朝给定总目标前进一步){

利用可行的决策,求出可行解的一个解元素;

                                                   }

由所有解元素组合成问题的一个可行解;

下面给出Leetcode示例:

45. Jump Game II

这道题的要求是给定一整数数组,数组元素表示每次可以跳跃的最大距离。然后初始位置在数组的第一个元素,目的是以最少的步数到达最后元素。

例如A={2,3,1,1,4},初始位置0出为2,最终跳的最少次数是2,即先从0跳到1位置,此时1位置是3,正好可以一次跳到结束位置,加起来正好两次是最小次数了。

采用贪心算法,引入reach变量表示可以能到达的最远处,这也就是全局最优解;当遍历到i时,局部最优解即次局部下最远可达位置A[i]+i,此时全局的最优解reach和A[i]+i的最大值,即reach=max(reach,A[i]+i)

除此之外还要记录跳的次数,至于什么时候step需要加1?答案是当前的i超过了前一步的最远位置。所以引入last变量记录上一步能到达的最远位置。

代码:

  1. int jump(vector<int>& nums){
  2. int reach=0;//全局最远可达位置
  3. int last=0;//上一步最远能到达位置
  4. int step=0;//i需要超过上一步最远位置时加1
  5. for(int i=0;i<=reach&&i<nums.size();i++)
  6. {
  7. if(i>last){step++;last=reach;}
  8. reach=max(reach,nums[i]+i);
  9. }
  10. return reach>=(nums.size()-1)?step:0;//超过也算是到了终点
  11. }

121. Best Time to Buy and Sell Stock

一个序列代表每天股票卖出价格,贪心法,分别找到价格最低和最高的一天,低进高出,注意最低的一天要在最高的一天之前且只能交易一次。遍历一次,由局部推出全局最优。

  1. int maxProfit(vector<int>& prices){
  2. int res=0;
  3. if(prices.size()<=1)return res;
  4. int curmin=prices[0];
  5. for(int i=0;i<prices.size();i++)
  6. {if(curmin>prices[i])curmin=prices[i];
  7. if(res<(prices[i]-curmin))res=(prices[i]-curmin);
  8. }//只要大于前者就是收益
  9. return res;
  10. }

122. Best Time to Buy and Sell Stock II

相比121,本题有多次买卖机会,同一时刻只能持有一个股票,只有当当前的股票卖掉才能买新的股票。例如:2 3 1 5 6 9 2 那么最大的利益就是2-3和1-9段相加为9。故只需找出局部递增序列。

  1. int maxProfit(vector<int>& prices) {
  2. int res=0;
  3. if(prices.size()<=1)return res;
  4. for(int i=0;i<prices.size();){
  5. int j=i;
  6. while(j+1<prices.size()&&prices[j+1]>prices[j])j++;
  7. if(j==i){i++;}//一开始就不增加
  8. else {res+=prices[j]-prices[i];i=j+1;}//增加若干
  9. }
  10. return res;
  11. }
123. Best Time to Buy and Sell Stock III
该题最多两次交易。类似121,只不过考虑到最多两次交易,可从前后两段开始。

  1. int maxProfit(vector<int>& prices) {
  2. int res=0;
  3. if(prices.size()<=1)return res;
  4. //分前后两段
  5. vector<int> pre(prices.size(),0);
  6. vector<int> aft(prices.size(),0);
  7. //pre iterator
  8. int curmin=prices[0];
  9. for(int i=1;i<prices.size();i++){
  10. if(curmin>prices[i])curmin=prices[i];
  11. pre[i]=max(prices[i]-curmin,pre[i-1]);
  12. }
  13. //after
  14. int curmax=prices[prices.size()-1];
  15. for(int i=prices.size()-2;i>=0;i--){
  16. if(curmax<prices[i])curmax=prices[i];
  17. aft[i]=min(prices[i]-curmax,aft[i+1]);//负数
  18. }
  19. //merge
  20. for(int i=0;i<prices.size();i++)
  21. if(res<pre[i]-aft[i])res=pre[i]-aft[i];//负数,所以减去aft
  22. return res;
  23. }



摘自博文:五大经典算法之四贪心算法