【9】leetcode note

题目:

1282. 用户分组

1422. 分割字符串的最大得分

1475. 商品折扣后的最终价格

个人总结


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中的值 


1422. 分割字符串的最大得分 题目

给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。

「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。

 这道题虽然说是简单题,个人一开始的想法

如果分割以后再遍历,肯定会开销很大

按道理应该遍历一次,记住有多少个0和1,那么每次就是遍历一边,然后就可以减去对应的值

不如遍历一共有多少个1,然后截取左边,遍历,但是这样还是得遍历n次

换个思路,左边是0,右边是1,那么就是如何确保左边最少1,右边最少0,即取双方得最大最小值,

上面这种个人想法和官方参考答案的枚举差不多,但是感觉效率并不是那么高

参考其他做法:

有一种就是第一次记录每一个前面有多少个1, 然后剩下的就是0,再遍历一次求和的数组就可以得出答案。即计算每个子串的前缀和。

但是似乎不管什么方法都是需要二次遍历,所以其实也不用想太多......


1475. 商品折扣后的最终价格

给你一个数组 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] 的值

这是一个代码习惯的问题,确实需求纠正一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值