1. 程式人生 > >高效面試之貪心演算法

高效面試之貪心演算法

Your goal is to reach the last index in the minimum number of jumps.

For example:
Given array A = [2,3,1,1,4]

The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

選擇最長的步數能保證最小的次數。

class Solution {

public:

    int jump(int A[], int n) {

        if(0==n)

           return 0;

        int cur=0,next=0,maxdistance=-1,count=0;//初始化老是出錯

        while(true)

        {

            if(next>=n-1) //寫成maxdistance>=n-1老是[0]測試用例通不過

               return count;

            for(cur;cur<=next;++cur)

            {

                maxdistance=max(maxdistance,cur+A[cur]);//貪心演算法,選擇cur到next範圍內最大的移動值,當前編號+當前位置可移動的最大值

            }

cur=next; //下一步的新起點

            next=maxdistance; //這一步能夠走得最大值

            count++;

        }

    }

};

題目2:

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

找到最大利潤,你只能進行一次交易

分析:

貪心法,分別找到價格最低和最高的一天,低進高出,注意最低的一天要在 把原始價格序列變成差分序列,本題也可以做是最大 m 子段和,m = 1。

i--版本 用最大值

class Solution {

public:

    int maxProfit(vector<int> &prices) {

        if(prices.size() == 0)

            return 0;

        int ans;//最大差價

        int maxPrices=prices[prices.size()-1];

        for(int i=prices.size()-1;i>=0;i--)

        {

            maxPrices=max(maxPrices,prices[i]);//第i天之後,即i+1到第n天的最大利益maxPrices,即找曲線的最大值

            ans=max(ans,maxPrices-prices[i]);//即i+1到第n天的最大利益maxPrices減去第i天,即第i天最大利益;ans為前面i天中利益最大的一天

        }

        return ans;

    }

};

i++ 版本 用最小值

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

找到最大利潤,你可以進行多次交易 不需要最大最小值,只要交易能夠賺錢,我就交易。 class Solution { public:     int maxProfit(vector<int> &prices) {         if(prices.size()==0 || prices.size()==1)             return 0;         int ans[prices.size()-1];         int buypoint=0,sellpoint=prices.size()-1;         ans[0]=0;         for(int i=0;i<prices.size()-1;i++)         {             if(prices[i+1]>=prices[i])             {                 sellpoint=i+1;                 buypoint=i;//第一次寫忘了             }             else             {                 ans[i+1]=ans[i]; /*如果prices[i+1]<prices[i],前i+1天最大利益儲存不變,同時選擇最低點買入股票*/                 buypoint=i+1;             }             if(sellpoint>=buypoint && prices[i+1]>=prices[i])//第一次寫這裡也忘了              ans[i+1]=max(prices[sellpoint]-prices[buypoint],ans[i]+prices[i+1]-prices[i]);         }         return ans[prices.size()-1];     } }; 簡化版本: 分析 貪心法,低進高出,把所有正的價格差價相加起來。 把原始價格序列變成差分序列,本題也可以做是最大 m 子段和,m = 陣列長度。 程式碼 // LeetCode, Best Time to Buy and Sell Stock II // 時間複雜度 O(n),空間複雜度 O(1) class Solution { public: int maxProfit(vector<int> &prices)  {     int sum = 0;     for (int i = 1; i < prices.size(); i++)      {         int diff = prices[i] - prices[i - 1];         if (diff > 0) sum += diff;     }     return sum;     } }; 題目3: Longest Substring Without Repeating Characters 描述 Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for ”abcabcbb” is ”abc”, which the length is 3. For ”bbbbb” the longest substring is ”b”, with the length of 1.

題4:

Container With Most Water

描述

Given n non-negative integers a1; a2; :::; an, where each represents a point at coordinate (i; ai). n verti-

cal lines are drawn such that the two endpoints of line i is at (i; ai) and (i; 0). Find two lines, which together

with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container

相關推薦

高效面試貪心演算法

Your goal is to reach the last index in the minimum number of jumps. For example: Given array A = [2,3,1,1,4] The minimum number of jumps to reach the

高效面試字串匹配(KMP,AC演算法

3.AC 多模匹配演算法  看下面這個例子:給定5個單詞:say she shr he her,然後給定一個字串yasherhs。問一共有多少單詞在這個字串中出現過。 三步:構建trik樹,給trik樹新增失敗路徑,建立AC自動機,根據AC自動機搜尋文字 1.構建trik樹  1constint ki

演算法導論 貪心演算法- 矩陣鏈相乘

作者:鄒祁峰 郵箱:[email protected] 日期:2014.05.08 轉載請註明來自"祁峰"的CSDN部落格 1 引言     在大學期間,我們學過高等數學中的線性規劃,其

acm貪心演算法題目6

Problem Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n

acm貪心演算法題目5

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher g

高效面試實現strcpy等簡單庫函式

atoi,itoa strcpy,strstr,strcmp memcpy,memove,memset 1.itoa  注意:字串倒置 char* itoa(int a,char* string) { int i=0,j=0; ch

高效面試動態規劃DP

解題關鍵: 理解結構特徵,抽象出狀態,寫成狀態轉移方程。 題目索引 1.三角形找一條從頂到底的最小路徑 分析 設狀態為 f (i; j ),表示從從位置 (i; j ) 出發,路徑的最小和,則狀態轉移方程為 f(i,j)=min{f

常用演算法貪心演算法

思路:求解問題時,總是選當前最好的選擇,不從整體上考慮。因而選用貪心演算法必須保證當前選的最好的必定是整體最好的。 示例 分發餅乾 假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多隻能給一塊餅乾。對每個孩子 i ,都有一個胃口值 gi ,這是能讓孩子們滿足胃口的餅乾的最小尺寸;並且

python資料結構貪心演算法

目錄 貪心演算法的基礎知識 分糖果 (LeetCode 455) 搖擺序列(LeetCode 376) 移除K個數字(LeetCode 402) 跳躍遊戲1 (LeetCode 55) 跳躍遊戲2 (LeetCode 45) 射擊氣球(LeetCode 45

C++ 貪心演算法 ( 刪數問題 )

貪心演算法 — 刪數問題 : 鍵盤輸入一個高精度的正整數n(n<=240位),去掉其中任意s個數字後剩下的數字按照原來的次序將組成一個新的正整數。程式設計對給定的n和s,尋求一種方案,使得剩下組

演算法設計與分析(三)貪心演算法

前面兩篇:貪心演算法的特點設計要素:貪心法適用於組合優化問題。求解過程是多不判斷過

演算法導論貪心演算法:帶懲罰的任務排程演算法

帶懲罰的任務排程問題: 單處理器上帶截止時間和懲罰的單位時間任務排程問題有以下輸入: 1、n個單位時間任務的集合S={a1,a2,……,an}; 2、n個整數截止時間d1,d2,……,dn,每個di滿足1<=di<=n,我們期望任務ai在時間di之前完成。 3、

(基於Java)演算法貪心演算法——活動安排問題

貪心演算法(Greedy Algorithm):又名貪婪演算法。貪心演算法是指,在對問題求解時,總是做出在當期看來是最好的選擇。也就是說,貪心演算法能決定出最好的下一步,它不是從整體最優上考慮,而僅僅是在某種意義上的區域性最優解。 值得注意的是:在某些問題上,用貪心演算法

貪心演算法最大的子組合求解

      本來博主是沒有心情寫這篇部落格了,因為昨天住的地方遭賊了。半夜兩點多,偷開我家窗戶,把博主臥室裡面的玫瑰金給偷走了。當時博主就睡得特別不舒服,半夜醒來就發現手機被偷了。搞得博主後半夜基本沒有睡,萬幸的是,博主的手機開了“查詢iphone”功能,因此開啟了丟失

演算法貪心學習 --- 兩個案例

貪心演算法 演算法簡介: 貪心演算法是指:在每一步的求解的步驟中,他要求"貪婪"的選擇最佳操作,並希望通過一系列的最優選擇,找到一個全域性的最優解。(但有時候是找不到全域性最優); 貪心演算法需滿足: 可行性:即每一步都必須滿足

演算法學習——貪心演算法可拆揹包

演算法描述 已知道n種物品和一個可容納c重量的揹包,第i種物品的重量為wi,價值為pi,裝包的時候可以把物品拆開(即可只裝每種物品的一部分),設計如何裝包,使裝包所得整體的價值最高? 演算法思路 首先,我們要知道,n種物品以及他們對應的價值,都是由使用者輸入的 我們使用貪心演算法,每

貪心演算法典型應用——以最小前進次數到達陣列最後一個位置

1、題目說明: 輸入一個所有元素都是自然數的陣列,初始狀態你的位置位於第1個元素,每個元素的位置表示1步,當前所在位置的元素數值表示你下一次前進能夠移動的最大步數,你的目標是以最小的前進次數從陣列的第一個元素移動到陣列的最後一個元素位置,你需要輸出每次前進的步數。 2、舉例:

貪心演算法 6*6,5*5,4*4,3*3,2*2,1*1分包裹問題

題目描述 一個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有六個型號,他們的長寬分別為11, 22, 33, 44, 55, 66。這些產品通常使用一個 66h 的長方體包裹包裝然後郵寄給客戶。因為郵費很貴,所以工廠要想方設法的減小每個訂單運送時的包裹數量。他們很需

基礎演算法貪心法、二分法及其他演算法思想和技巧

基礎演算法學習筆記(三) 1. 貪心法 1.1 簡單貪心 1.2 區間貪心 2. 二分法 2.1 二分查詢 2.2 快速冪 3. two pointers 3.1 什麼是two

《iOS面試道》演算法基礎學習(上)

前言道長和唐巧的面試之道,剛出來第一時間就入手了,也是趁著公司目前不是很忙,能好好靜下心來細讀這本書.這本書的一大亮點就在第二章的演算法基礎了,所以想通過筆記的形式來記錄演算法的學習過程,同時在忘記的時候也能第一時間翻閱檢視.這部分程式碼都是通過Swift來講解的,