题目:
1282. 用户分组
个人总结
1282. 用户分组 题目:
有 n 个人被分成数量未知的组。每个人都被标记为一个从 0 到 n - 1 的唯一ID 。
给定一个整数数组 groupSizes ,其中 groupSizes[i] 是第 i 个人所在的组的大小。例如,如果 groupSizes[1] = 3 ,则第 1 个人必须位于大小为 3 的组中。
返回一个组列表,使每个人 i 都在一个大小为 groupSizes[i] 的组中。
每个人应该 恰好只 出现在 一个组 中,并且每个人必须在一个组中。如果有多个答案,返回其中 任何 一个。可以 保证 给定输入 至少有一个 有效的解。
这道题很容易看懵的,因为在首先得收集,然后得分类。一开始想到使用数组多次遍历,但是这样在时间和空间开销上会很高。
第一,如何将值分类?
题目中给了一个数组,如何根据值进行分类,在这个问题上思考很久,考虑使用数组,但是并不知道数组的大小,因为不知道对应有多少元素,因此数组就不能考虑了。那么后面就考虑使用list。
第二,如何管理list
因为题目中会出现不同的数组大小值,所以无非确定是否已经创建,在这一方面可以考虑使用Map,将值得大小做为键值,将对应得值加入到对应得队列,这样就可以减少空间同时提高速度
相关知识:
hashMap的 *.putIfAbsent(key, defaultKey);
对于HashMap的遍历方法:
获取Map中所有值的集合: *.entrySet()
for(Map.Entry<Integer, List<Integer>> entry : hashMap.entrySet())
//遍历Map中的值
给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。
「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。
这道题虽然说是简单题,个人一开始的想法
如果分割以后再遍历,肯定会开销很大
按道理应该遍历一次,记住有多少个0和1,那么每次就是遍历一边,然后就可以减去对应的值
不如遍历一共有多少个1,然后截取左边,遍历,但是这样还是得遍历n次
换个思路,左边是0,右边是1,那么就是如何确保左边最少1,右边最少0,即取双方得最大最小值,
上面这种个人想法和官方参考答案的枚举差不多,但是感觉效率并不是那么高
参考其他做法:
有一种就是第一次记录每一个前面有多少个1, 然后剩下的就是0,再遍历一次求和的数组就可以得出答案。即计算每个子串的前缀和。
但是似乎不管什么方法都是需要二次遍历,所以其实也不用想太多......
给你一个数组 prices ,其中 prices[i] 是商店里第 i 件商品的价格。
商店里正在进行促销活动,如果你要买第 i 件商品,那么你可以得到与 prices[j] 相等的折扣,其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ,如果没有满足条件的 j ,你将没有任何折扣。
这道题其实很简单,最快的方式就是使用两次循环就可以搞定了。
最主要想记录一下使用单调栈的感受
这道题栈的思想就是从后面开始找,因为要确保前面的值大于后面的值,所以,假如当前位置为i,那么其对应的值应该要比后面的值大才有折扣,也是说后面比他大的值都是没有意义的,因为前面最先遇到的值就是位于 i 的这个值,也就是说,只能在 i 后面寻找其更小的值而不能找比他大的值,因为如果比 i 大, 如果连 i 都不满足, 那么后面都不会满足了。
class Solution {
public int[] finalPrices(int[] prices) {
Stack<Integer> starc = new Stack<Integer>();
for(int i = prices.length - 1; i >=0 ; i--){
while(!starc.isEmpty() && starc.peek() > prices[i]){
starc.pop();
}
int res = prices[i];
prices[i] = starc.isEmpty() ? prices[i] : prices[i] - starc.peek();
starc.push(res);
}
return prices;
}
}
我这种代码写法确实不推荐,因为不应该修改传入值,会导致很多问题的。
int res = prices[i];
一开始没有写这个,而且直接
starc.push(prices[i]);
这样子导致最后一个值,是无非做任何处理的,因为每次我们传入的是
prices[i] = starc.isEmpty() ? prices[i] : prices[i] - starc.peek();
通过这个方法修改的,所以每次push进去的值都不是原理prices[i] 的值
这是一个代码习惯的问题,确实需求纠正一下