代码随想录算法训练营第33天 | 1005.K次取反后最大化的数组和、134.加油站、135.分发糖果
- 自己看到题目的第一想法
- 看完代码随想录之后的想法
- 自己实现过程中遇到哪些困难
- 今日收获,记录一下自己的学习时长
链接: 1005.K次取反后最大化的数组和
链接: 134. 加油站
链接: 135.分发糖果
自己看到题目的第一想法
1005.K次取反后最大化的数组和:输出只需要和,不需要知道具体下标,所以是可以排序再进行反转的。先将所有数进行排序,从负数开始去反转,并且每反转一个就将k减1,之后再对最小的非负数进行多次反转,直到k减为0。这个思路还是很清晰,但具体到代码如何实现是需要再看一看的。
134.加油站:可以环绕行驶一周的条件就是,在行驶的过程中邮箱的油量一直是正数。可以用一个while判断循环。
135.分发糖果: 看到例子之后发现和旁边相等的孩子好可怜,因为题目要求相邻高的得到的多,但是没说相等的怎么办,由于贪心所以只能给他更少的糖果了。最终返回的是数量,并不需要知道具体分配情况,所以可以直接根据rang数组的差值数组来对总体糖果数进行有选择的加1。只通过了17/48个样例,有样例没有通过,我的思维的缺陷是,如果中间值是最大的,就没必要对中间值增加两次。
看完代码随想录之后的想法
1005.K次取反后最大化的数组和:
以下是一些代码中不太懂的地方,做出自己第一次的解释。
// 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小nums = IntStream.of(nums) //将nums数组转换成IntStream流.boxed() //IntStream转成包装类型Stream<Integer>.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)) //用lambda表达式表达绝对值降序排列.mapToInt(Integer::intValue).toArray(); //Integer::intValue操作将Integer包装类型转成int类型,toArray将流转成数组
这段代码总体实现是将数组按照绝对值大小从大到小降序排列,实现过程是使用流,中间涉及到将数组转成IntStream流和将Intstream转成包装类型以及这两步的逆操作。核心代码是中间的sorted(),并且利用了lambda表达式来表达绝对值降序排列。
134.加油站:
这道题和买卖股票的思路蛮相近,将gas[i]-cost[i]得到rest[i],i从0开始累加rest[i],和记为curSum,如果对currenSum求和得到负数,一旦currentSum小于0,说明[0,i]区间不能作为起始位置,起始位置从i+1算起,再从0计算currentSum进行循环。
class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int curSum = 0;int totalSum = 0;int index = 0;for (int i = 0; i < gas.length; i++) {curSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];if (curSum < 0) {index = (i + 1) % gas.length ; curSum = 0;}}if (totalSum < 0) return -1;return index;}
}
代码写法也是很妙的,用了两个数组来存储总体求和,对其中一个做模拟过程,另一个就直接看逻辑上是否能够转一圈。
35.分发糖果:
自己实现过程中遇到哪些困难
今日收获,记录一下自己的学习时长
1.java的stream流
(1)流是什么?是数据结构吗?
流是一种用于处理数据集合的高级API,提供了一种声明式的方式处理数据,而不是通过显式迭代来处理数据。数据结构式存储和组织数据的容器,但是流是对数据的计算,强调处理数据的流水线操作,流本身不存储数据,而是从数据源中获取数据。
(2)流的特点以及经典示例:
1.惰性操作:只有在需要结果时,如调用结果(collect,toArray才会执行)
2.不可逆性
3.管道操作
List<String> words = Arrays.asList("apple", "banana", "cherry", "date");
List<String> result = words.stream() // 创建一个流.filter(word -> word.startsWith("a")) // 过滤以'a'开头的单词.sorted() // 排序.collect(Collectors.toList()); // 收集结果到列表
System.out.println(result); // 输出: [apple]
首先利用数组创建一个流,之后过滤以’a’开头的单词,再排序之后收集结果到列表,最后再输出。
(3)看完这段代码发现,用流操作真的很方便,直接调用流所对应的api去操作对数据的流水线操作即可。
2.java中包装类型Integer和整型int