思路:cookie
行首的權值最大,故首先將其置1;ide
每列因爲權值相同,故只須要將0多於1的狀況反轉便可優化
思路:spa
1.計算每一個字母的最右邊界下標,並記錄到新數組中code
2.經過遍歷原數組,當下標與當前的最右邊界相等時,即表示當前字母能夠覆蓋前面全部字母的最右邊界;blog
劃分出新區間,同時當前的下標更新爲新區間的左邊界ip
122. 買賣股票的最佳時機 IIleetcode
思路:
每當後面的數比前一個數大,就將其差價加到利潤中
思路:
肯定對應的情侶數(0對1,2對3,,,),查找並將其替換
思路:
判斷是否爲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 }
思路:
先對餅乾大小及小孩胃口作降序排列,而後將二者作比較,使用餅乾儘量知足多的小孩
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 }
思路:
題意要求不一樣的任務(字母)間必須有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 }
思路:
先處理數據獲得一組加油耗油後的數據
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 }
優化代碼:
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 }