博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leedcode_贪心算法系列
阅读量:4988 次
发布时间:2019-06-12

本文共 4762 字,大约阅读时间需要 15 分钟。

 

思路:

    行首的权值最大,故首先将其置1;

    每列由于权值相同,故只需要将0多于1的情况反转即可

 

思路:

    1.计算每个字母的最右边界下标,并记录到新数组中

    2.通过遍历原数组,当下标与当前的最右边界相等时,即表示当前字母可以覆盖前面所有字母的最右边界;

       划分出新区间,同时当前的下标更新为新区间的左边界

 

思路:

    每当后面的数比前一个数大,就将其差价加到利润中

 

思路:

    确定对应的情侣数(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 else15 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 else31 return false;32 }33 else34 return false;35 break;36 default:return false;37 }38 } 39 40 return true;41 }
View Code

 

思路:

  先对饼干大小及小孩胃口做降序排列,然后将两者做比较,使用饼干尽可能满足多的小孩

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
=g[i])40 {41 i++,j++;42 res ++;43 }44 else45 i++;46 } 47 48 return res;49 }
View Code

 

思路:

    题意要求不同的任务(字母)间必须有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

 

 

思路:

    先处理数据得到一组加油耗油后的数据

 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

 

 

 

 

    

转载于:https://www.cnblogs.com/mind000761/p/9945285.html

你可能感兴趣的文章
5月8-5月12日iOS周总结
查看>>
runTime
查看>>
30 . (Java)面向对象编程六大基本原则
查看>>
将博客搬至CSDN
查看>>
《软件工程》这门课的疑惑
查看>>
自定属性的描叙信息类
查看>>
原型与原型链
查看>>
bzoj 3786 星系探索 dfs+splay
查看>>
只含一个单词的句子
查看>>
面向对象JAVA多态性
查看>>
32款极具创意的宣传册设计
查看>>
BZOJ 2431: [HAOI2009]逆序对数列
查看>>
pagination用法
查看>>
顾辰朝思
查看>>
Core Data系列六——Custom Migration
查看>>
Katu Puzzle(2-sat)
查看>>
最大子序列系列问题
查看>>
ARC与MRC
查看>>
Android开发之延时执行
查看>>
【1】Django概述
查看>>