【LeetCode】Sama的个人记录_75

在这里插入图片描述

for循环的哈希降维问题

经典的for循环哈希降维:a+b=sum --> b=sum-a(sum固定,循环a,哈希寻找b)
本题的for循环哈希降维:a+b+c=d --> a+b=d-c(手动固定bc,循环d,哈希寻找a)

一个细节是:逆序遍历b的话,每次只多了一种c的情况(b+1),因此c的位置不需要单独遍历
class Solution {
    public int countQuadruplets(int[] nums) {
        int res = 0;
        int len = nums.length;
        Map<Integer, Integer> map = new HashMap<>();
        for (int b = len - 3; b >= 1; b--) {
            // 统计(d - c)
            for (int d = b + 2; d < len; d++) {
                map.put(nums[d] - nums[b + 1], map.getOrDefault(nums[d] - nums[b + 1], 0) + 1);
            }
            // 统计(a + b)
            for (int a = 0; a < b; a++) {
                res += map.getOrDefault(nums[a] + nums[b], 0);
            }
        }
        return res;
    }
}

 
 

在这里插入图片描述

贪心+直接模拟
分割出的顺子是唯一确定的,排序后每次直接从最小的数字开始顺(局部最优),可以保证得到唯一分割集合(全局最优)
class Solution {
    public boolean isNStraightHand(int[] hand, int groupSize) {
        if (hand.length % groupSize != 0) {
            return false;
        }
        Arrays.sort(hand);
        // 计数
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : hand) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        // 模拟
        for (int num : hand) {
            if (map.containsKey(num)) {
                for (int i = num; i < num + groupSize; i++) {
                    if (map.containsKey(i)) {
                        map.put(i, map.get(i) - 1);
                        if (map.get(i) == 0) {
                            map.remove(i);
                        }
                    } else {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

 
 

在这里插入图片描述

已知xxxx年xx月xx日,求该天是星期几?
1)查的某一天是星期几,然后求距离该天的总天数,处理后模7
2)蔡勒公式直接得出
class Solution {
    public String dayOfTheWeek(int day, int month, int year) {
        String[] weeks = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
        int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
        // 1970年12月31日是周四
        // 下面计算距该天的总天数
        int cnt = 0;
        for (int i = 1971; i < year; i++) {
            cnt += (isLeap(i) ? 366 : 365);
        }
        for (int i = 1; i < month; i++) {
            cnt += months[i - 1];
            if (i == 2) {
                cnt += (isLeap(year) ? 1 : 0);
            }
        }
        cnt += day;
        return weeks[(cnt + 3) % 7];
    }

    private boolean isLeap(int year) {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }
}
class Solution {
    public String dayOfTheWeek(int day, int month, int year) {
        // 蔡勒公式
        int[] ZELLER = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
        String[] weeks = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        year -= (month < 3 ? 1 : 0);
        return weeks[(year + year/4 - year/100 + year/400 + ZELLER[month-1] + day) % 7]; 
    }
}

 
 
 
 
 
 
 
 
 
 
 
 
 
 

检索标记:1185. 一周中的第几天输入为三个整数:day、month 和 year,分别表示日、月、年。您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}。846. 一手顺子Alice 手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是groupSize ,并且由 groupSize 张连续的牌组成。给你一个整数数组 hand 其中 hand[i] 是写在第 i 张牌,和一个整数 groupSize 。如果她可能重新排列这些牌,返回 true ;否则,返回 false 。1995. 统计特殊四元组给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 :nums[a] + nums[b] + nums[c] == nums[d] ,且a < b < c < d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值