首页 > 其他分享 >暑期练习

暑期练习

时间:2024-07-06 10:30:47浏览次数:12  
标签:return nums int 练习 List 暑期 dp 1000

0705

494. 目标和

首先考虑了使用dfs但是结果超时

class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        def dfs(nums,target,index,n):
            if n==index: 
                if target==0:
                    return 1
                else :
                    return 0
            return dfs(nums,target-nums[index],index+1,n)+dfs(nums,target+nums[index],index+1,n)
        return dfs(nums,target,0,len(nums))

接着使用dp得到结果
遍历[-1000,1000]的所有可能性
j + 1000是为了变量的映射
dp[i-1][j + 1000]可以直接跳到dp[i][j + nums[i] + 1000]和dp[i][j - nums[i] + 1000],理由是i-1 \(\rightarrow\) i只需要\(\pm\) nums[i]+1000,原因是dp[i][j]是i个数组成数字j的方案数。

class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        n = len(nums)
        dp = [[0] * 2001 for _ in range(n)]
        dp[0][nums[0] + 1000] += 1
        dp[0][-nums[0] + 1000] += 1
        for i in range(1, n):
            for j in range(-1000, 1001):
                if dp[i-1][j + 1000] > 0:
                    dp[i][j + nums[i] + 1000] += dp[i-1][j + 1000]
                    dp[i][j - nums[i] + 1000] += dp[i-1][j + 1000]
        return dp[n-1][target + 1000]

3115. 质数的最大距离

"""
简单的判断,双指针左右同时搜索,遇到第一个质数就停下,如果两个指针都停下就结束返回结果
需要注意的重点是continue不要忘记,遇到了质数之后指针不需要继续向前,以及while f or r:,应该是两个指针都查找到才停止,只要有一个没有找到就应该继续,所以需要使用or而不是and。
"""
class Solution:
    def maximumPrimeDifference(self, nums: List[int]) -> int:
        def is_prime(num):
            if num <= 1:
                return False
            for i in range(2, int(num**0.5) + 1):
                if num % i == 0:
                    return False
            return True
        n=len(nums)
        left=0
        right=n-1
        f,r=True,True
        while f or r:
            if f:
                if is_prime(nums[left]):
                    f=False
                    continue
                left+=1
            if r:
                if is_prime(nums[right]):
                    r=False
                    continue
                right-=1
        return right-left

//Java
class Solution {
    public int maximumPrimeDifference(int[] nums) {
        int n=nums.length;
        int left=0;
        int right=n-1;
        boolean f = true; 
        boolean r = true;
    while (f || r) {
        if (f) {
            if (isPrime(nums[left])) {
                f = false;
                continue;
            }
            left++;
        }
        if (r) {
            if (isPrime(nums[right])) {
                r = false;
                continue;
            }
            right--;
        }
    }
    
    return right - left;
}

private boolean isPrime(int num) {
    if (num <= 1) {
        return false;
    }
    for (int i = 2; i <= Math.sqrt(num); i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}
}

3099. 哈沙德数

//非常基础
class Solution {
    public int sumOfTheDigitsOfHarshadNumber(int x) {
        int sum=0;
        int temp=x;
        while (temp>0){
            sum += temp % 10;
            temp /= 10;
        }
        if (x%sum==0){
            return sum;
        }
        else{
            return -1;
        }
    }
}

3033. 修改矩阵

//基础题
class Solution:
    def modifiedMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
        m=len(matrix)
        n=len(matrix[0])
        record=[]
        ma=[0]*n
        for i in range(n):
            for j in range(m):
                if matrix[j][i]==-1:
                    record.append([j,i])
                ma[i]=max(ma[i],matrix[j][i])
        for j,i in record:
            matrix[j][i]=ma[i]
        return matrix

0706

3101. 交替子数组计数

"""
本题重点是理解,dp[i]的状态,我这里假设的是以nums[i]为结尾的子数组为交替子数组的数量,所以结尾需要sum(dp)
装填转移方程为1. 
$$
dp[i]=dp[i-1]+1 if nums[i] != nums[i-1]
dp[i]=1 if nums[i] = nums[i-1]
$$
举[1,2,2,1]作为例子
i=0时显然dp[0]=1,i=1的时候dp[1]=1+1=2{[2],[1,2]两种[1]不算在内,因为假设的是以nums[i]为结尾的子数组为交替子数组的数量)}
dp[2]=1,dp[3]=2
return 1+2+2+1=6
"""
class Solution:
    def countAlternatingSubarrays(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 1:
            return 1
        dp= [1] * n
        dp[1]= 2 if nums[0] != nums[1] else 1
        for i in range(2,n):
            if nums[i] != nums[i-1]:
                dp[i] = dp[i-1]+1
            else:
                dp[i] = 1
        return sum(dp)

接下来是用时和内存的改进,使用滚动数组,因为我们注意到状态只和前一个状态有关也就是dp[i]只会和dp[i-1]有关,因此我们只需要一个参数last记录前一状态即可

class Solution:
    def countAlternatingSubarrays(self, nums: List[int]) -> int:
        n = len(nums)
        res=1
        if n == 1:
            return res
        last=2 if nums[0]!=nums[1] else 1
        res+=last
        for i in range(2,n):
            if nums[i] != nums[i-1]:
                last = last+1
            else:
                last = 1
            res+=last
        return res

标签:return,nums,int,练习,List,暑期,dp,1000
From: https://www.cnblogs.com/zzddkkhome/p/18285338

相关文章

  • 07_04_暑期个人赛1
    C.Caninepoetry时间:2024-07-05原题:GoodBye2020C.Caninepoetry题意对于一个字符串\(s\),可以对任一字符变为\(*\)号,使所有子串不为回文串,即可将\(babba\)变为\(ba*ba\)使字符串内不存在回文串数据范围:\(|s|\le1e5\)思路对于某回文字符串,如果是长度为奇数,那......
  • IT启航:高考后暑期学习指南——从零到一,筑梦未来
    前言随着高考的尘埃落定,对于那些心怀梦想、志在IT领域的少年来说,一个充满无限可能的暑假正悄然开启。这个假期不仅是放松与庆祝的时刻,更是自我提升、提前布局未来的关键时期。作为曾经的追梦人和如今的行业一员,我愿将自己从零开始的IT学习之旅整理成一份详实的学习路线图,助力......
  • 开启IT世界的第一步:高考新生的暑期学习指南
    目录前言了解IT领域 学习编程语言 实践项目 学习资源 阅读专业书籍 培养良好的学习习惯 结语 最后-投票首先,我开始针对初学者,纯小白同学,开始输出WEB前端纯0基础的知识内容了,如果你需要,请关注这个专栏:WEB前端小白从这里出发_经海路大白狗的博客-CSDN博客......
  • C语言控制流练习题
    当用户输入5的时候,使用嵌套循环产生下列图案(5行美元符号,每行递增一个字符#include<stdio.h>intmain(void){intline;//输入行数scanf("%d",&line);inti;for(i=1;i<=line;i++)//从每行开始打印{for(intj=1;j<=i;j++)//每一行需要打印数{......
  • css练习2
    一、 选择题1. 下列哪些CSS属性可以被子元素继承?AA. colorB.borderC.marginD.padding只有以color/font-/text-/line-开头的属性才可以继承2. 下列哪个不是可以继承的属性?DA. font-sizeB.text-decorationC.font-weightD.border-width只有以color/......
  • java第三十课 —— 面向对象练习题
    面向对象编程练习题第一题定义一个Person类{name,age,job},初始化Person对象数组,有3个person对象,并按照age从大到小进行排序,提示,使用冒泡排序。packagecom.hspedu.homework;importjava.util.SortedMap;publicclassHomework01{publicstaticvo......
  • OpenStack Yoga版安装笔记(四)keystone练习
    1、keyston安装过程在安装过程中,首先需要在controllernode上的MariaDB中创建一个名为keystone的数据库。接着,在controllernode上安装Keystone软件包,并配置数据库连接。Keystone和数据库可以部署在不同的服务器上,Keystone通过解析主机名“controller”来访问数据库。2、......
  • 【C语言】指针和数组经典练习题(一)
    //一维数组inta[]={1,2,3,4};printf("%d\n",sizeof(a));printf("%d\n",sizeof(a+0));printf("%d\n",sizeof(*a));printf("%d\n",sizeof(a+1));printf("%d\n",sizeof(a[1]));printf("%d\n",sizeof(&a......
  • c#循环小练习之最后的练习
    不死神兔最开始有一对小兔小兔子一个月成长为中兔中兔成长一个月为大兔并且生下一对小兔兔子不会死问一年一共有多少只兔子分别输出显示最后的c#循环小练习咯上代码intxiao=1;intzhong=0;intda=0;......
  • 14.计数器拓展练习
    (1)Visio视图:(2)Verilog代码:modulecounter_ten(clk,reset_n,led_out);inputclk;inputreset_n;outputregled_out;//0.5s=500_000_000ns=20ns*25_000_000;需要25位的寄存器去储存。reg[24:0]cnt;regen_cnt;regcn......