找到所有数组中消失的数、最小操作次数使数组元素相等、分发饼干_找到所有数组中消失的数字

  • [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
    */
    public static int minMoves(int[] nums) {
    Arrays.sort(nums);
    int lg = nums.length;
    int step = 0;
    while (true){
    int min = nums[0];
    int max = nums[lg - 1];
    if (max == min){
    break;
    }
    for (int i = 0; i < lg - 1; i++) {
    nums[i] = nums[i] + 1;
    }
    step++;
    Arrays.sort(nums);
    }
    return step;
    }

哈哈,果然如此,超出时间限制。


是不是arrays.sort消耗了过多的性能?改进一下


#### 小编菜解进阶版



public static int minMoves(int[] nums) {
int lg = nums.length;
int step = 0;
int max = 0;
int min = 0;
while (true){
for (int i = 0; i < lg; i++) {
if (nums[i] > max){
max = nums[i];
}
if (nums[i] < min){
min = nums[i];
}
}
if (max == min){
break;
}
for (int i = 0; i < lg - 1; i++) {
nums[i] = nums[i] + 1;
}
step++;
}
return step;
}


依然超时。 


因为最大值与最小值之差,最小值想等于最大值,最小要进行max-min次+1,因此可以再次改进。


#### 小编菜解终极版



public static int minMoves(int[] nums) {
int step = 0;
int min = 0;
int max = nums.length - 1;
while (true){
for (int i = 0; i < nums.length; i++) {
if (nums[max] < nums[i]){
max = i;
}
if (nums[min] > nums[i]){
min = i;
}
}
int diff = nums[max] - nums[min];
if (diff == 0){
break;
}
step += diff;
for (int i = 0; i < nums.length; i++) {
if (i != max){
nums[i] = nums[i] + diff;
}
}
}
return step;
}


依然超时,治标不治本,本身算法的问题。


#### 大佬指点江山



public static int minMoves(int[] nums) {
Arrays.sort(nums);
int count = 0;
for (int i = nums.length - 1; i > 0; i–) {
count += nums[i] - nums[0];
}
return count;
}


 看了十分钟,硬是没看懂。先这样吧。


### 3、LeetCode 455.分发饼干


#### 题目



> 
> 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
> 
> 
> 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
> 
> 
> 


#### 小编思路



> 
> 1、孩子一个数组,饼干一个数组,先按从大到小排序
> 
> 
> 2、倒序遍历饼干,倒序遍历孩子,饼干能满足孩子,则成功+1
> 
> 
> 3、当饼干遍历完毕,或者孩子遍历完毕,结束循环
> 
> 
> 


#### 小编菜解



public static int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);//孩子{1,2}
Arrays.sort(s);//饼干{1,2,3}
//可以分的饼干数量
int sum = 0;
int step = 0;
//遍历饼干
for (int i = s.length - 1; i >= 0; i–) {
if ((g.length-step) > 0){
//遍历孩子
System.out.println(“还剩孩子数:”+(g.length-1-step+1));
for (int j = g.length-1-step; j >= 0 ; j–) {
step++;
//最大的饼干满足尾款最大的孩子时,完成+1
System.out.println(“饼干:”+s[i]);
System.out.println(“孩子胃口:”+g[j]);
if(s[i] >= g[j]){
sum++;
System.out.println(“分配饼干成功:”+sum);
break;
}
}
}
}
return sum;
}


#### 大佬指点江山



public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int numOfChildren = g.length, numOfCookies = s.length;
int count = 0;
for (int i = 0, j = 0; i < numOfChildren && j < numOfCookies; i++, j++) {
while (j < numOfCookies && g[i] > s[j]) {
j++;
}
if (j < numOfCookies) {
count++;
}
}
return count;
}




推荐阅读


[【100天算法入门 - 每日三题 - Day16】第三大的数、字符串中的单词数、排列硬币](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day15】判断子序列、最长回文数、Fizz Buzz](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day14】两个数组的交集、有效的完全平方数、字符串中的第一个唯一字符](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day13】反转字符串、反转字符串中的元音字母、两个数组的交集](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day12】Nim游戏、3的幂、4的幂](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day11】丢失的数字、移动零、单词规律](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day10】二叉树的所有路径、各位相加、丑数](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day9】汇总区间、2的幂、有效的字母异位词](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day8】同构字符串、存在重复元素、翻转二叉树](https://bbs.csdn.net/topics/618317507)


[【100天算法入门 - 每日三题 - Day7】验证回文串、只出现一次的数字、多数元素](https://bbs.csdn.net/topics/618317507)




**(1)Python所有方向的学习路线(新版)**  

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。



![在这里插入图片描述](https://img-blog.csdnimg.cn/1f807758e039481fa866130abf71d796.png#pic_center)



**(2)Python学习视频**



包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)



**(3)100多个练手项目**

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值