DAY7-力扣刷题

news2024/11/20 3:27:06

1.外观数列

38. 外观数列 - 力扣(LeetCode)

「外观数列」是一个数位字符串序列,由递归公式定义:

  • countAndSay(1) = "1"
  • countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。

//考虑递归和迭代两种思想 

amazing!!!

//同一个数字出现的次数我们考虑通过栈来进行分析

方法一:遍历生成

class Solution {
    public String countAndSay(int n) {
        String str="1";
        for(int i=2;i<=n;i++){
                StringBuffer stringBuffer=new StringBuffer();
                int start=0;
                int pos=0;
                //11
                //
                while(pos<str.length()){
                    int m=0;
                    while(pos<str.length()&&str.charAt(pos)==str.charAt(start)){
                        pos++;
                        m++;
                    }
                    stringBuffer.append(Integer.toString(m)).append(str.charAt(start));
                    start=pos;
                }
                str=stringBuffer.toString();
        } 
        return str;
    }
   
}

 2.组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

//我们主要找的数字应该小于target

//如果大于target直接是不成立的 

//我们首先把数组从大到小进行排序

//如果可以整除的话,我们就可以重复这些数字

//第一个数字还没有结束,此时我们的target变为target-第一个数字

//如果不能整除的话,我们把target-第一个数字

//循环结束的条件是target-相应的数字<0

//如果等于0的话我们就可以把我们所试验的值直接添加到数组中。

class Solution1 {
        public List<List<Integer>> combinationSum(int[] candidates, int target) {
            List<List<Integer>> list=new ArrayList<>();
            Arrays.sort(candidates);//从小到大进行排序
            int tmp=target;
            for(int i=0;i<candidates.length;i++){
                target=tmp;
                if(candidates[i]>target){
                    break;
                }
                int j=0;
                while(target<0&&j<candidates.length-1){
                    List<Integer> list1=new ArrayList<>();
                    if(target%candidates[j]==0){
                        for(j=0;j<(target/candidates[j]);j++){
                            list1.add(candidates[j]);
                        }
                        list.add(list1);
                    }else {
                        list1.add(candidates[j]);
                        target=target-candidates[j];
                        j++;
                        if(target==0){
                            list.add(list1);
                        }
                    }

                }


            }
            return list;

        }
    }

经过思考,我想我们是不是应该用递归

1,2,3,4,5

如果是可以整出我们就直接添加

如果不可以整除我们把target-目标值

//未完成

//卡壳了

class Solution2 {
        public List<List<Integer>> combinationSum(int[] candidates, int target) {
            List<List<Integer>> list=new ArrayList<>();
            Arrays.sort(candidates);//从小到大进行排序
            for(int i=0;i<candidates.length;i++){
                list.add(getTarget(candidates,target,i));
            }

            return list;

        }

        public List<Integer> getTarget(int[] candidates,int target,int index){

            int tmp=target;
            for(int i=0;i<candidates.length;i++){
                target=tmp;
                if(candidates[i]>target){
                    break;
                }
                int j=0;
                while(target<0&&j<candidates.length-1){
                    List<Integer> list1=new ArrayList<>();
                    if(target%candidates[j]==0){
                        for(j=0;j<(target/candidates[j]);j++){
                            list1.add(candidates[j]);
                        }
                        list.add(list1);
                    }else {
                        list1.add(candidates[j]);
                        target=target-candidates[j];
                        j++;
                        if(target==0){
                            list.add(list1);
                        }
                    }
                }
            }
        }
    }
}

仍然是回溯法 (需要了解回溯法)

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> ans=new ArrayList<>();
        List<Integer> combine=new ArrayList<>();
        dfs(candidates,target,ans,combine,0);
        return ans;
    }
    public void dfs(int[] candidates, int target, List<List<Integer>> ans, List<Integer> combine, int idx) {
        if(idx==candidates.length){
            return;
        }
        if(target==0){
            ans.add(new ArrayList<Integer>(combine));
            return;
        }
        //直接跳过
        dfs(candidates,target,ans,combine,idx+1);
        //选择当前数
        if(target-candidates[idx]>=0){
            combine.add(candidates[idx]);
            dfs(candidates, target - candidates[idx], ans, combine, idx);
            combine.remove(combine.size() - 1);
        }
    }
}

3.组合总和2(暂时不看)

40. 组合总和 II - 力扣(LeetCode)

方法一:回溯+剪枝 

public class Solution {

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        int len = candidates.length;
        List<List<Integer>> res = new ArrayList<>();
        if (len == 0) {
            return res;
        }

        // 关键步骤
        Arrays.sort(candidates);

        Deque<Integer> path = new ArrayDeque<>(len);
        dfs(candidates, len, 0, target, path, res);
        return res;
    }

    /**
     * @param candidates 候选数组
     * @param len        冗余变量
     * @param begin      从候选数组的 begin 位置开始搜索
     * @param target     表示剩余,这个值一开始等于 target,基于题目中说明的"所有数字(包括目标数)都是正整数"这个条件
     * @param path       从根结点到叶子结点的路径
     * @param res
     */
    private void dfs(int[] candidates, int len, int begin, int target, Deque<Integer> path, List<List<Integer>> res) {
        if (target == 0) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = begin; i < len; i++) {
            // 大剪枝:减去 candidates[i] 小于 0,减去后面的 candidates[i + 1]、candidates[i + 2] 肯定也小于 0,因此用 break
            if (target - candidates[i] < 0) {
                break;
            }

            // 小剪枝:同一层相同数值的结点,从第 2 个开始,候选数更少,结果一定发生重复,因此跳过,用 continue
            if (i > begin && candidates[i] == candidates[i - 1]) {
                continue;
            }

            path.addLast(candidates[i]);
            // 调试语句 ①
            // System.out.println("递归之前 => " + path + ",剩余 = " + (target - candidates[i]));

            // 因为元素不可以重复使用,这里递归传递下去的是 i + 1 而不是 i
            dfs(candidates, len, i + 1, target - candidates[i], path, res);

            path.removeLast();
            // 调试语句 ②
            // System.out.println("递归之后 => " + path + ",剩余 = " + (target - candidates[i]));
        }
    }


}

4.字符串相乘

43. 字符串相乘 - 力扣(LeetCode)

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

失败,溢出了

class Solution {
    public static String multiply(String num1, String num2) {
        int sumnum1=0;
        int sumnum2=0;
        int count=0;
        for(int i=0;i<num1.length();i++){
            count=num1.charAt(i)-'0';
            int step1=num1.length()-i;
            int m=(int)Math.pow(10,step1-1);
            sumnum1=m*count+sumnum1;
        }
        for(int j=0;j<num2.length();j++){
            count=num2.charAt(j)-'0';
            int step2=num2.length()-j;
            int m=(int)Math.pow(10,step2-1);
            sumnum2=count*m+sumnum2;
        }
        long intsum=sumnum1*sumnum2;
        return intsum+"";
    }
}

 方法一:做加法

class Solution {
    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        String ans = "0";
        int m = num1.length(), n = num2.length();
        for (int i = n - 1; i >= 0; i--) {
            StringBuffer curr = new StringBuffer();
            int add = 0;
            for (int j = n - 1; j > i; j--) {
                curr.append(0);
            }
            int y = num2.charAt(i) - '0';
            for (int j = m - 1; j >= 0; j--) {
                int x = num1.charAt(j) - '0';
                int product = x * y + add;
                curr.append(product % 10);
                add = product / 10;
            }
            if (add != 0) {
                curr.append(add % 10);
            }
            ans = addStrings(ans, curr.reverse().toString());
        }
        return ans;
    }

    public String addStrings(String num1, String num2) {
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        StringBuffer ans = new StringBuffer();
        while (i >= 0 || j >= 0 || add != 0) {
            int x = i >= 0 ? num1.charAt(i) - '0' : 0;
            int y = j >= 0 ? num2.charAt(j) - '0' : 0;
            int result = x + y + add;
            ans.append(result % 10);
            add = result / 10;
            i--;
            j--;
        }
        ans.reverse();
        return ans.toString();
    }
}

5.跳跃游戏2(暂时不看)

45. 跳跃游戏 II - 力扣(LeetCode)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i] 
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

贪心算法

解题思路

这道题是典型的贪心算法,通过局部最优解得到全局最优解。以下两种方法都是使用贪心算法实现,只是贪心的策略不同。

方法一:反向查找出发位置 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

康谋分享 | 从CAN到CAN FD:ADTF在汽车网络中的应用

随着汽车电子技术的发展&#xff0c;车辆上配备了越来越多的电子装置&#xff0c;这些设备多采用点对点的方式通信&#xff0c;这也导致了车内存在庞大的线束。造成汽车制造和安装的困难并进一步降低汽车的配置空间&#xff0c;汽车总线逐步开始向网络化方向发展。 在此背景下…

解决typora 上传图片问题

解决typora 上传图片问题 最近在写博客的时候&#xff0c;经常是在typora上先写在导入&#xff0c;但是发现在导入的时候图片上传不了&#xff0c;需要手动上传&#xff0c;这就很麻烦了&#xff0c;所以今天根据typora自动上传图片的功能解决一下上传图片的问题 一、下载PicGo…

QTimeEdit、QDateEdit、QDateTimeEdit、QCalendarWidget

实验 QTime和字符串相互转换 QDate和字符串相互转换 QDateTime和字符串相互转换 QCalendarWidget使用 year&#xff0c;month&#xff0c;day&#xff0c;minute&#xff0c;second&#xff0c;msec&#xff0c;dayOfWeek, dayto方法/属性的使用 布局 datetimeexample.cpp #inc…

九、数据结构(并查集)

文章目录 1.并查集操作的简单实现2.解决问题3. 并查集优化3.1 合并的优化3.2查询优化3.3查询优化2 通常用“帮派”的例子来说明并查集的应用背景&#xff1a;在一个城市中有 n ( n < 1 0 6 ) n(n < 10^6) n(n<106)个人&#xff0c;他们分成不同的帮派&#xff0c;给出…

42、基于神经网络的训练堆叠自编码器进行图像分类(matlab)

1、训练堆叠自编码器进行图像分类的原理及流程 基于神经网络的训练堆叠自编码器进行图像分类的原理和流程如下&#xff1a; 堆叠自编码器&#xff08;Stacked Autoencoder&#xff09;是一种无监督学习算法&#xff0c;由多个自编码器&#xff08;Autoencoder&#xff09;堆叠…

报表控件Stimulsoft 图表轴的日期时间步长模式

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

Mellanoxnvidia ib高速网络常用命令总结

1.spci&#xff1a;检查本地的pci设备。示例&#xff1a;lspci| grep -i mell 2.ofed_info&#xff1a;检测ofed驱动版本。示例&#xff1a;ofed_info-s 3.ibstat&#xff1a;查看本机的ib网卡状态。 4.mst&#xff1a;mellnoax软件管理工具。用来生成IB设备描述符。提供给其他…

华北水利水电大学-C程序设计作业

目录 基础题 1-1 分析 代码实现 1-2 分析 代码实现 1-3 分析 代码实现 1-4 ​编辑 分析 代码实现 1-5 分析 代码实现 1-6 分析 代码实现 基础题 1-1 从键盘输入10个学生的有关数据&#xff0c;然后把它们转存到磁盘文件上去。其中学生信息包括学号、姓名…

公司电脑加密软件——【中科数安】电脑文件资料透明加密,防泄密系统

中科数安电脑文件资料透明加密防泄密系统介绍 中科数安提供的电脑文件资料透明加密防泄密系统&#xff0c;是一款专为企业电脑终端设计的数据安全解决方案。该系统通过采用先进的透明加密技术和精细化的权限管理&#xff0c;旨在全方位保护公司电脑中存储、处理、传输的各类文…

新书速览|Ubuntu Linux运维从零开始学

《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助。《Ubuntu Linux运…

【分布预测】DistPred:回归与预测的无分布概率推理方法

论文题目&#xff1a;DistPred: A Distribution-Free Probabilistic Inference Method for Regression and Forecasting 论文作者&#xff1a;Daojun Liang, Haixia Zhang&#xff0c;Dongfeng Yuan 论文地址&#xff1a;https://arxiv.org/abs/2406.11397 代码地址&#xff1a…

2024 AI大模型 常问的问题以及答案(附最新的AI大模型面试大厂题 )

前言 在2024年AI大模型的面试中&#xff0c;常问的问题以及答案可能会涵盖多个方面&#xff0c;包括AI大模型的基础知识、训练过程、应用、挑战和前沿趋势等。由于我无法直接附上174题的完整面试题库及其答案&#xff0c;我将基于提供的信息和当前AI大模型领域的热点&#xff…

神经网络模型---ResNet

一、ResNet 1.导入包 import tensorflow as tf from tensorflow.keras import layers, models, datasets, optimizersoptimizers是用于更新模型参数以最小化损失函数的算法 2.加载数据集、归一化、转为独热编码的内容一致 3.增加颜色通道 train_images train_images[...,…

lucene原理

一、正排索引 Lucene的基础层次结构由索引、段、文档、域、词五个部分组成。正向索引的生成即为基于Lucene的基础层次结构一级一级处理文档并分解域存储词的过程。 索引文件层级关系如图1所示&#xff1a; 索引&#xff1a;Lucene索引库包含了搜索文本的所有内容&#xff0…

window端口占用情况及state解析

背景&#xff1a; 在电脑使用过程中&#xff0c;经常会开许多项目&#xff0c;慢慢地发现电脑越来越卡&#xff0c;都不知道到底是在跑什么项目导致&#xff0c;于是就想查看一下电脑到底在跑什么软件和项目&#xff0c;以作记录。 常用命令 netstat -tuln &#xff1a; 使用…

【YOLOv8改进[注意力]】使用CascadedGroupAttention(2023)注意力改进c2f + 含全部代码和详细修改方式 + 手撕结构图

本文将进行在YOLOv8中使用CascadedGroupAttention注意力改进c2f 的实践,助力YOLOv8目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。 改进前和改进后的参数对比: 目录 一 CascadedGroupAttention 二 使用CascadedGroupAttent…

《Linux运维总结:prometheus+altermanager+webhook-dingtalk配置文件详解》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、prometheus配置文件 Prometheus的配置文件是prometheus.yml&#xff0c;在启动时指定相关的…

ECharts综合案例一:近七天跑步数据

一周跑步数据图表分析 引言 在运动数据分析中&#xff0c;可视化工具能够帮助我们更直观地理解运动表现。本周&#xff0c;我们使用 ECharts 创建了一组图表&#xff0c;包括雷达图和折线图&#xff0c;来展现跑步数据。 效果预览 收集了一周内每天的跑步数据&#xff0c;通…

中医药人工智能大模型正式启动

6月15日&#xff0c;在横琴粤澳深度合作区举行的中医药广东省实验室&#xff08;以下简称横琴实验室&#xff09;第一届学术委员会第一次会议暨首届横琴中医药科技创新大会上&#xff0c;中医药横琴大模型、中药新药智能自动化融合创新平台同时启动。这也是该实验室揭牌半年来取…

西班牙的人工智能医生

西班牙的人工智能医生 西班牙已将自己定位为欧洲负责任人工智能领域的领导者。然而&#xff0c;透明度的承诺往往落空&#xff0c;公共监督机构一直难以获得对司法和福利系统中部署的算法的有效访问。这使得西班牙成为一种日益增长的趋势的一部分&#xff0c;即政府悄悄地试验预…