leedcode_貪心算法系列

 

861. 翻轉矩陣後的得分數組

思路:cookie

    行首的權值最大,故首先將其置1;ide

    每列因爲權值相同,故只須要將0多於1的狀況反轉便可優化

 

763. 劃分字母區間ui

思路:spa

    1.計算每一個字母的最右邊界下標,並記錄到新數組中code

    2.經過遍歷原數組,當下標與當前的最右邊界相等時,即表示當前字母能夠覆蓋前面全部字母的最右邊界;blog

       劃分出新區間,同時當前的下標更新爲新區間的左邊界ip

 

122. 買賣股票的最佳時機 IIleetcode

思路:

    每當後面的數比前一個數大,就將其差價加到利潤中

 

765. 情侶牽手

思路:

    肯定對應的情侶數(0對1,2對3,,,),查找並將其替換

 

860. 檸檬水找零

思路:

  判斷是否爲5,10,20;是則按數量找零,零錢不夠時返回false 

 1 bool lemonadeChange(int* bills, int billsSize) {  2     int i,j,k;  3     int use[3+1] = {0,0,0,0,};  4     for (i = 0 ; i < billsSize ; i ++)  5  {  6         switch(bills[i])  7  {  8             case 5:  9                 use[1]++;break; 10             case 10: 11                 use[2]++; 12                 if (use[1]>0) 13                     use[1]--; 14                 else
15                     return false; 16                 break; 17             case 20: 18                 use[3]++; 19                 if (use[1]>0) 20  { 21                     
22                     if (use[2]>0) 23  { 24                         use[2]--,use[1]--; 25  } 26                     else if (use[1]>3) 27  { 28                         use[1] -= 3; 29  } 30                     else
31                         return false; 32  } 33                 else
34                     return false; 35                 break; 36             default:return false; 37  } 38  } 39     
40     return true; 41 }
View Code

 

455. 分發餅乾

思路:

  先對餅乾大小及小孩胃口作降序排列,而後將二者作比較,使用餅乾儘量知足多的小孩

 1 int findContentChildren(int* g, int gSize, int* s, int sSize) {  2     int i,j,k,res = 0;  3     
 4     //對孩子胃口及餅乾大小作降序排列
 5     for (i = 0 ; i < gSize ; i ++)  6  {  7         k = i;  8         for (j=i+1; j < gSize ; j ++)  9  { 10             if (g[j] > g[k]) 11                 k = j; 12  } 13         if (i != k) 14  { 15             g[i] = g[i] ^ g[k]; 16             g[k] = g[i] ^ g[k]; 17             g[i] = g[i] ^ g[k]; 18  } 19  } 20     for (i = 0 ; i < sSize ; i ++) 21  { 22         k = i; 23         for (j=i+1; j < sSize ; j ++) 24  { 25             if (s[j] > s[k]) 26                 k = j; 27  } 28         if (i != k) 29  { 30             s[i] = s[i] ^ s[k]; 31             s[k] = s[i] ^ s[k]; 32             s[i] = s[i] ^ s[k]; 33  } 34  } 35     
36     //餅乾儘量得知足小孩
37     for (i=j=0; i<gSize && j<sSize ; ) 38  { 39         if (s[j]>=g[i]) 40  { 41             i++,j++; 42             res ++; 43  } 44         else
45             i++; 46  } 47     
48     return res; 49 }
View Code

 

621. 任務調度器

思路:

    題意要求不一樣的任務(字母)間必須有n長度的冷卻時間,

    1.當n=0時:最短期即爲任務的總長度

    2.當n>0時

        咱們先找出數量最多的任務,便可肯定大體的最短期(n+1)*(max-1)

  而後查找是否還有任務的個數是與max相同,個數初始i=1

  最後獲得總長度:(n+1)*(max-1)+i

 1 #define MAX(X,Y) X>Y?X:Y
 2 int leastInterval(char* tasks, int tasksSize, int n) {  3     int i,j,k;  4     int arr[26];  5     memset(arr,0,sizeof(arr));  6     
 7     //計算各任務的個數
 8     for (i = 0 ; i < tasksSize ; i ++)  9         arr[tasks[i]-'A'] ++; 10     
11     //降序處理
12     for (i = 0 ; i < 26 ; i ++) 13  { 14         k = i; 15         for (j = i+1 ; j < 26 ; j ++) 16             if (arr[j] > arr[k]) 17                 k = j; 18         if (k!=i) 19  { 20             arr[i] = arr[i] ^ arr[k]; 21             arr[k] = arr[i] ^ arr[k]; 22             arr[i] = arr[i] ^ arr[k]; 23  } 24  } 25     
26     //計算最短期 
27     for (i=0; i<26 ; i ++) 28         if (arr[i] != arr[0]) 29             break; 30         
31     return MAX((arr[0]-1)*(n+1)+i,tasksSize); 32 }
View Code

 

 134. 加油站

思路:

    先處理數據獲得一組加油耗油後的數據

 1.若處理後的數據總和爲負數,車必然不能運行,返回-1

    2.分別以非負數爲起點,遍歷一圈看其可否回到原點

 1 int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {  2     int i,j,k,res = -1;  3     int use[gasSize];  4     memset(use,0,sizeof(use));  5     
 6     k = 0;  7     //處理獲得加油耗油後的數據
 8     for (i = 0 ; i < gasSize ; i ++)  9  { 10         use[i] = gas[i]-cost[i]; 11         k += use[i]; 12  } 13     
14     //剩餘油量不能爲負數
15     if (k>=0) 16  { 17         for (i = 0 ; i < gasSize ; i ++) 18  { 19             //以非負數爲起點
20             if (use[i]>=0) 21  { 22                 k = use[i]; 23                 //遍歷一圈看其可否回到原點
24                 for (j=(i+1)%gasSize ; j!=i && k>0 ; j=(j+1)%gasSize) 25                     k += use[j]; 26                 if (k>=0 && j==i) 27                     return i; 28  } 29  } 30  } 31     
32     return res; 33 }
View Code

 優化代碼:

 1 int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {  2     int i,totol,sum,start;  3     totol = sum = start = 0;  4     for (i = 0 ;  i < gasSize ; i ++)  5  {  6         totol += gas[i]-cost[i];  7         sum += gas[i]-cost[i];  8         if (sum<0)  9  { 10             sum = 0; 11             start = i+1; 12  } 13  } 14     
15     return totol<0?-1:start; 16 }
View Code
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息