leetcode第252场周赛

5830. 三除数

在这里插入图片描述

题目描述

给你一个整数n。如果n恰好有三个正除数,返回true ;否则,返回false
如果存在整数k,满足n = k*m,那么整数m就是n的一个 除数
提示:

  • 1<=n<=10^4

解题思路

这题就遍历就行

class Solution {
    public boolean isThree(int n) {
    	if(n<=2)
    		return false;
    	int i=2;
    	int flag = 0;
    	while(i<n) {
    		if(n%i==0) {
    			if(n/i!=i)
    				return false;
    			else {
    				flag++;
    			}
    		}
    		i++;
    	}
    	return flag==1?true:false;
    }
}

5831. 你可以工作的最大周数

题目描述

给你n个项目,编号从0n-1。同时给你一个整数数组milestones,其中每个milestones[i]表示第i个项目中的阶段任务数量。

你可以按下面两个规则参与项目中的工作:

  • 每周,你将会完成某一个项目中的恰好一个阶段任务。你每周都必须工作。
  • 连续的两周中,你不能参与并完成同一个项目中的两个阶段任务。

一旦所有项目中的全部阶段任务都完成,或者仅剩余一个阶段任务都会导致你违反上面的规则,那么你将停止工作。注意,由于这些条件的限制,你可能无法完成所有阶段任务。

返回在不违反上面规则的情况下你最多能工作多少周。
提示:

  • n==milestones.length
  • 1 <= n <= 10^5
  • 1 <= milestones[i] <= 10^9

解题思路

本来想用优先队列模拟来做,然后超时了。
之后想着最坏情况就是一个特别大,大于其他数之和。
因此只需要判断是否存在最大值Max大于其他数之和,存在则返回2*Sum+1,否则返回Sum+Max。

class Solution {
       public long numberOfWeeks(int[] milestones) {
    	int Max = 0;
    	long Sum = 0;
    	for(int n:milestones) {
    		Max = Math.max(Max, n);
    		Sum+=n;
    	}
    	Sum-=Max;
    	if(Max>Sum)
    		return 2*Sum+1;
    	else
    		return Sum+Max;
    }
}

5187. 收集足够苹果的最小花园周长

题目描述

给你一个用无限二维网格表示的花园,每一个整数坐标处都有一棵苹果树。整数坐标(i, j)处的苹果树有|i|+|j|个苹果。
你将会买下正中心坐标是(0, 0)的一块正方形土地,且每条边都与两条坐标轴之一平行。
给你一个整数neededApples,请你返回土地的最小周长,使得 至少 有neededApples个苹果在土地里面或者边缘上

|x|的值定义为:

  • 如果x>=0,那么值为x
  • 如果x<0,那么值为-x

解题思路

找规律题,每次增加一次,会使得每个边长增加 2 i + 1 + 4 ( i + 1 ) 2i+1+4(i+1) 2i+1+4(i+1),总个数增加 4 ∗ ( 4*( 4(上一次边长上水果和+边长长度*1 ) + 4 ∗ 2 ∗ ( )+4*2*( )+42(边长长度 + 1 ) +1) +1)

class Solution {
    public long minimumPerimeter(long neededApples) {
//    	int Max = 100000000;
//    	long[] dp = new long[Max];
//    	dp[1] = 5;
//    	
    	long dp1 = 5;
    	long dp2 = 5;
    	int i=1;
    	long Sum = 12;
    	while(Sum<neededApples) {
    		dp2 = dp1+2*i+1+4*(i+1);
    		Sum = Sum+4*(dp1+2*i+1)+8*(i+1);
    		dp1 = dp2;
    		i++;
    	}
    	return 8*(i);
    }
}

5833. 统计特殊子序列的数目

题目描述

特殊序列是由正整数0,紧接着正整数1,最后正整数2组成的序列。

比方说,[0,1,2][0,0,1,1,1,2]是特殊序列。
相反,[2,1,0][1][0,1,2,0]就不是特殊序列。
给你一个数组nums包含整数012),请你返回不同特殊子序列的数目。由于答案可能很大,请你将它对10^9+7取余后返回。

一个数组的子序列是从原数组中删除零个或者若干个元素后,剩下元素不改变顺序得到的序列。如果两个子序列的下标集合不同,那么这两个子序列是不同的

解题思路

当时竞赛的时候没时间了,也没来得及多想,最后看的别人的解题思路,只觉得自己是个菜鸡。
动态规划的题目,和黄叶收集者那题很像,哎,又败在dp。
d p [ 0 ] dp[0] dp[0]记录0的子序列数目。
d p [ 1 ] dp[1] dp[1]记录01的子序列数目。
d p [ 2 ] dp[2] dp[2]记录012的子序列数目。
针对 n u m [ i ] num[i] num[i]的情况不同,进行处理

  • n u m [ i ] = 0 num[i]=0 num[i]=0时,0的子序列数目增加dp[0]+1个,因为最后一个0可以和之前所以的排列组合成子序列,单个也能组成子序列。
  • n u m [ i ] = 1 num[i]=1 num[i]=1时,01的子序列增加dp[0]+dp[1]个,因为当前1能和之前的01子序列组成01子序列,也能和0子序列组成01子序列。
  • n u m [ i ] = 2 num[i]=2 num[i]=2时,012的子序列增加dp[1]+dp[2]个,因为当前2能和之前的01子序列组成012子序列,也能和012子序列组成012子序列。
class Solution {
    public int countSpecialSubsequences(int[] nums) {
    	long[] dp = new long[3];
    	int Mod = 1000000000+7;
    	for(int i:nums) {
    		if(i==0) {
    			dp[0]+=dp[0]+1;
    		}else if(i==1){
    			dp[1]+=dp[0]+dp[1];
    		}else {
    			dp[2]+=dp[1]+dp[2];
    		}
			dp[i]%=Mod;
    	}
    	return (int) dp[2];
    }
}
### LeetCode周赛概述 LeetCode周赛是一项在线编程竞赛活动,旨在帮助程序员提升算法能力并准备技术面试。参与者可以在规定的时间内解决一系列具有挑战性的编程问题[^1]。 ### 参加方法 为了参与LeetCode周赛,用户需先注册一个LeetCode账号,并定期关注官方公告获取最新的赛事通知。比赛通常会在周末举行,在比赛当天登录网站进入指定的比赛页面即可开始作答。对于初次参赛者来说,可能会遇到一些操作上的不熟悉,比如不清楚在哪里提交解答等问题,但随着经验积累这些问题都会迎刃而解[^2]。 ### 比赛时间安排 LeetCode周赛一般固定在北京时间每周日凌晨01:00(UTC/GMT+8)准时开赛,持续时间为两小时。在此期间,选手可以自由选择任意连续的两个小时完成比赛中的题目。需要注意的是,具体的比赛日期和时间可能因节假日等因素有所调整,请务必留意官网发布的最新消息[^4]。 ### 题目类型分析 比赛中涉及的题目种类繁多,涵盖了数据结构、算法设计等多个方面。常见的题目形式包括但不限于: - 数组与字符串处理 - 动态规划 - 图论及其应用 - 排序与查找技巧 - 栈队列等高级数据结构的应用 这些题目往往要求较高的逻辑思维能力和扎实的基础知识掌握程度。例如,在某些情况下,一道看似简单的数组运算题也可能隐藏着深层次的数据结构优化思路;而在另一些景下,则需要运用到复杂的动态规划策略来解决问题[^5]。 ```python def example_function(input_data): """ 这是一个示例函数,用于展示如何编写Python代码。 参数: input_data (list): 输入的数据列表 返回: result (int): 计算后的结果值 """ # 处理输入数据... processed_data = sorted(input_data) # 执行核心计算逻辑... result = sum(processed_data[:3]) return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值