WooKinson

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

861. 翻转矩阵后的得分

思路:

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

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

 

763. 划分字母区间

思路:

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

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

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

 

122. 买卖股票的最佳时机 II

思路:

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

 

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

 

 

 

 

    

posted on 2018-11-15 14:58  WooKinson  阅读(382)  评论(0编辑  收藏  举报