网站设计好做吗做网站比较好的软件

web/2025/9/29 9:32:42/文章来源:
网站设计好做吗,做网站比较好的软件,免费稳定的网站空间,电子商务成功的网站今天是LeetCode专题第20篇文章#xff0c;今天讨论的是数字组合问题。描述给定一个int类型的候选集#xff0c;和一个int类型的target#xff0c;要求返回所有的数字组合#xff0c;使得组合内所有数字的和刚好等于target。注意#xff1a;所有的元素都是正数所有元素没有…今天是LeetCode专题第20篇文章今天讨论的是数字组合问题。描述给定一个int类型的候选集和一个int类型的target要求返回所有的数字组合使得组合内所有数字的和刚好等于target。注意所有的元素都是正数所有元素没有重复答案不能有重复每一个元素可以使用若干次样例 1:Input: candidates [2,3,6,7], target 7,A solution set is:[ [7], [2,2,3]]样例 2:Input: candidates [2,3,5], target 8,A solution set is:[ [2,2,2,2], [2,3,3], [3,5]]题解我们拿到这道题还是按照老规矩来思考暴力的解法但是仔细一想会发现好像没有头绪没有头绪的原因也很简单因为题目当中的一个条件一个元素可以随意使用若干次。我们根本不知道一个元素可以使用多少次这让我们的暴力枚举有一种无从下手的感觉。如果去掉这个条件就方便多了因为每个元素只剩下了两个状态要么拿要么不拿我们可以用一个二进制的数来表示。这就引出了一个常用的表示状态的方法——二进制表示法。二进制表示法举个例子假如当下我们有3个数字这3个数字都有两个状态选或者不选我们想要枚举这3个数字的所有状态应该怎么办我们当然可以用递归来实现在每层递归当中做决策当前元素选或者不选分别递归。但是可以不用这么麻烦我们可以用二进制简化这个过程。这个原理非常简单我们都知道在计算机二进制当中每一个二进制位只有两个状态0或者1那么我们就用1表示拿0表示不拿那么这三个数拿或者不拿的状态其实就对应一个二进制的数字了。3位二进制对应的数字是0到7也就是说我们只需要遍历0到7就可以获得这3位所有拿和不拿的状态了。比如说我们当下遍历到的数字是55的二进制表示是101我们再把1和0对应拿和不拿两种状态。那么5就可以对应上第一和第三个拿第二个不拿的状态了。我们可以用位运算很方便地进行计算。比如我们要判断第i位是否拿了我们可以用(1 i)左移n位就相当于乘上了2的n次方。1对应右边起第0位也就是最低位的二进制位我们对它做左移i的操作就相当于乘上了 2^i 那么就得到了第i位了。我们拿到了之后只需要将它和状态state做一个二进制中的与运算就可以得到state中第i位究竟是0还是1了。因为在二进制当中and运算会将两个数的每一位做与运算运算的结果也是一个二进制数。由于我们用来进行与运算的数是(1 i)它只有第i位为1所以其他位进行与运算的结果必然是0那么它和state进行与运算之后如果结果大于0则说明state的第i位也是1否则则是0。这样我们就获取了state当中第i位的状态。由于位运算是指令集的运算在没有指令集优化的一些语言当中它的计算要比加减乘除更快。除了快以外它最大的好处是节省空间和计算方便这两个优点其实是一体的我们一个一个来说。首先来说节省空间有了二进制表示之后我们可以用一个32位的int来代表32个物体的0和1的所有状态。如果我们用数组来存储的话显然我们需要一个长度为32的数组需要的空间要大得多。这一点在单个状态下并不明显一旦数据量很大会非常显著。尤其是在密集的IO当中数据越轻量则传输效率越高。第二个优点是计算方便计算方便的原因也很简单假如我们要遍历所有的状态如果用数组或者其他数据结构的话免不了使用递归来遍历这样会非常麻烦。而使用二进制之后就方便了由于我们用二进制表示了所有元素0和1的状态我们只需要在一个整数范围做循环就可以了。就像刚才例子当中我们要枚举3个元素的状态我们只需要从0遍历到7即可。如果在多点元素也没问题如果是N个元素我们只需要从0遍历到(1 N) - 1。但是还有一个问题没解决你可能会说如果我们用int来表示状态的话最多只能表示32个物品的状态如果更多怎么办一个方法是使用int64即范围更大的int如果范围更大的int还是解决不了问题也没关系还有一些基于同样原理实现的第三方包可以支持。但是老实说我们基本上不会碰到超过64个物品让我们枚举所有状态的情况因为这个数字已经非常大了几乎可以说是天荒地老也算不完。回到问题我相信关于二进制表示法的使用和原理大家应该都了解了但是本题当中元素是可以多次出现的二进制表示法看起来并不顶用我们怎么解决这个问题呢难道这么大的篇幅就白写了当然不会白写针对这种情况也有办法。其实很简单因为题目当中规定所有的元素都是正数那么对于每一个元素而言我们最多取的数量是有限的。举个例子比如样例当中[2, 3, 6, 7] target是7对于元素2而言target是7即使可以多次使用也最多能用上3个2。那么我们可以拓充候选集将1个2拓充成3个同理我们可以继续拓充3最后候选集变成这样[2, 2, 2, 3, 3, 6, 7]这样我们就可以使用二进制表示法了。但是显然这个方法不靠谱因为如果数据当中出现一个1并且target稍微大一些那肯定直接gg显然会复杂度爆炸。所以这个方法只是理论上可行但是实际上并不具有可操作性我之所以拿出来介绍纯粹是为了引出二进制表示法。搜索解决一切当一个问题明显有很多种情况需要遍历但是我们又很难直接遍历的时候往往都是搜索问题我们可以思考一下能否用搜索问题的方法来解决。这题其实已经非常明显了搜索的条件已经有了搜索的空间也明白了剩下的就是制定搜索策略。我个人认为搜索策略其实就是搜索的顺序和范围合适的搜索顺序以及范围可以大大降低编码和计算的复杂度再穿插合适的剪枝就可以非常漂亮地完成一道搜索问题。我们带着思考来看这道题如果我们用回溯法来写这道题的话代码其实并不复杂。很容易就可以写出来你看只有几行我们每次遍历一个数加在当前的总和x上然后往下递归并且我们还加上了对当前和判断的剪枝。如果当前和已经超过了target那么显然已经不可能构成正解了我们直接跳过。但是我们也都发现了在上面这段代码里我们搜索的区间就是所有的候选值我们没有对这些候选值进行任何的限制。这其实隐藏了一个很大的问题还记得题目的要求当中有一条吗答案不能有重复。也就是说相同元素的不同顺序会被认为是同一个解我们需要去重。举个例子[3, 2, 2]和[2, 2, 3]会被认为是重复的但是在上面的搜索策略当中我们没有对这个情况做任何的控制这就导致了我们在找到所有答案之后还需要进行去重的工作。先找到包含重复的答案再进行去重这显然会消耗大量计算资源所以这个搜索策略虽然简单但远远不是最好的。我们先来分析一下问题究竟什么时候会出现重复呢我想大家列举一下应该都能发现就是当我们顺序错乱的时候。比如说我们有两个数3和4我们先选择3再选择4和先选择4再选择3是一样的。如果我们不对3和4的选择做任何限制那么就会出现重复。换句话说如果我们对3和4的选择确定顺序就可以避免重复如果从一开始就不会出现重复那么我们也就没有必要去重了这就可以节省下大量的时间。所以我们要做的就是确定搜索的时候元素选择的顺序在搜索的时候进行一定的限制从而避免重复。落实在代码当中就体现在我们枚举候选集的时候我们之前没有做任何限制我们现在需要人为加上限制我们只能选择之前选过的元素后面的只能往后拿不能往前拿。所以我们需要在dfs当中传入一个下标标记之前拿过的最大的下标我们只能拿这个下标之后的这样搜索就有了顺序就避免了元素重复和复杂度过高的问题。这一点确定了之后剩下的代码就很简单了。从代码上来看我们并没有做太大的改动所有的细节几乎都体现在搜索和遍历时的边界以及控制条件上。和整个算法以及代码逻辑比起来这些是最无关紧要的但是对于解决问题来说这些才是实实在在的。题目变形今天的题目有一个变种它就是LeetCode的第40题大部分题意都一样只有两个条件发生了变化。第一是40题当中去掉了候选集当中的元素没有重复的限制第二点是不再允许元素重复使用。其他的内容都和这题保持一致。我们想一下就会发现如果我们去掉重复使用的条件好像没什么变化我们是不是只要将递归遍历的条件稍稍改动就好了呢之前我们是从pos位置开始化后遍历现在由于不能重复所以之前取过的pos不能再取我们是不是只要将for循环改成从pos1开始就行了如果候选集的元素中没有重复这当然是可行的。但是很遗憾这个条件也被去掉了。所以候选集当中本身就可能出现重复如果还按照刚才的思路会出现重复的答案。原因也很简单举个例子比如说候选集是[1, 2, 3, 2, 2]target是5如果还用刚才的方法搜索的话我们的答案当中会出现两个[2, 3]。虽然我们也是每个元素都只用了一次但是仍然违背了答案不能重复的限制。你可能会有很多想法比如可以手动去重比如我们可以在元素数量上做手脚将重复的元素去重。很遗憾的是两者都不是最优解。第一种当然是可行的找到所有可行解再去重是一个很朴素的思路。通过优化可以解决复杂度问题。第二种想法并不可行因为如果我们把重复的元素去掉可能会导致某些解丢失。比如[1, 2, 2]也是和等于5但是如果我们把重复的2去掉了那么就无法得到这个解了。要解决问题我们还是要回到搜索策略上来。手动筛选、加工数据只是逼不得已的时候用的奇淫技巧搜索策略才是解题的核心。我们整理一下思路可以归纳出当前需要我们解决的问题有两个第一个是我们要找到所有解意味着我们不能删减元素第二个是我们想要搜索的结果没有重复。这看起来是矛盾的我们既想要不出现重复又想重复的元素可以出现这可能吗如果你仔细思考分析了你会发现是可能的。不过从搜索策略的角度上来说比较难想到。首先我们要保证元素的聚集性也就是说相同的元素应该聚集在一起。要做到这点很简单我们只需要排序就行了。这么做的原因也不难想到就是为了避免重复。如果数据是分散的我们是很难去重的还用刚才的例子当我们从2开始递归的时候我们可以找到解[2, 3]当我们从3开始递归的时候我们仍然可以找到解[3, 2]这两者是一样的。虽然我们限制了遍历的顺序严格地从前到后但是由于元素分散会使得我们的限制失去作用。为了限制依旧有效我们需要排序让相同的元素聚集这样我们每次搜索的内容其实是由大于等于当前元素的数字组成的答案这就保证了不在重复。但是这并没有解决所有的问题我们再来看一个例子候选集是[2, 2, 2, 3, 4]target是7显然[2, 2, 3]是答案但是我们怎么保证[2, 2, 3]只出现一次呢因为我们有3个2但是要选出两个2来我们需要一个机制使得只会找到一个答案。这点通过策略已经无能为力了只能依靠剪枝。我们当然可以引入额外的数据结构解决问题但会比较麻烦而我们其实有更简单的做法。这个做法是一个非常精妙的剪枝我们在递归当中加入一个判断当i pos1 and candidates[i] candidates[i-1]的时候则跳过。其中pos是上次选择的位置在递归的起始时带入的是-1我想这个条件应该大家都能看明白但是它为什么有效可能会一头雾水翻译成大白话这个条件其实是在限制一点在有多个相同元素出现的时候必须选择下标小的也就是前面的。我们分析一下可能触发continue的条件只有两种情况第一种其中pos是上次选择的数字我们假设它是1我们当前的位置在pos3。从上图可以看出来pos1到pos3全都相等。如果我们想要选择pos3而跳过pos1和pos2则会进入continue会跳过。原因也很简单因为前面递归的过程当中已经选过pos和pos1的组合了我们如果选了pos和pos3的组合一定会构成重复。也就是说我们保证了在连续出现的元素当中如果要枚举的话必须要从第一个开始。另一种情况也类似也就是说从pos到pos3都是2都相等这个时候我们跳过pos1和pos2直接选择pos3也会进入continue原因也很简单我们现在枚举的是获取两个2的情况在之前的递归当中已经没举过pos和pos1了我们现在想要跳过pos1和pos2直接获取pos3对应的情况是一样的所以需要跳过。我们将排序和上述的剪枝方法一起使用就解出了本题仔细观察一下会发现这两个方法根本是相辅相成天作之合单独使用哪一个也不管用但是一起作用就可以非常简单地解出题目。理解了这两点之后代码就变得很简单了不知道大家有没有从这个变种当中感受到搜索策略以及剪枝的威力和巧妙我个人还蛮喜欢今天的题目的如果能够把今天的两道题目吃透我想大家对于深度优先搜索和回溯算法的理解一定可以更上一个台阶这也是我将这两个问题合在一起介绍的原因。在明天的LeetCode专题当中我们会来看LeetCode41题查找第一个没有出现的自然数。今天的文章就到这里如果觉得有所收获请顺手点个关注吧你们的举手之劳对我来说很重要。

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

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

相关文章

简单的asp网站国际学院网站建设的意义

LinkedHashMap 集合源码分析 文章目录 LinkedHashMap 集合源码分析一、字段分析二、内部类分析三、构造方法分析四、内部方法分析五、总结 LinkedHashMap 是 HashMap 的子类,在 HashMap 的基础上维护了双向链表,保证了有序性。默认是不排序的&#xff0c…

丹灶网站建设seo搜狗

目录 线程的声明 线程创建过程 向线程中投递消息 从消息队列中取消息的具体实现 处理线程消息 webrtc线程模块的实现逻辑在 rtc_base\thread.h 文件中 比如想创建一个线程&#xff1a; //声明要创建的线程指针&#xff0c;通过智能指针管理 std::unique_ptr<rtc::Thr…

合浦县城乡规划建设局网站网站怎样建设才叫人性化

前言 扁平化概念的核心意义 去除冗余、厚重和繁杂的装饰效果。而具体表现在去掉了多余的透视、纹理、渐变以及能做出3D效果的元素&#xff0c;这样可以让“信息”本身重新作为核心被凸显出来。同时在设计元素上&#xff0c;则强调了抽象、极简和符号化。 示例 视频效果&…

英语网站online店匠怎么做网页

经过实践&#xff0c;weblogic节点管理器的作用主要有两点&#xff1a; 1、可通过weblogic控制台远程控制被管server启停。 2、可以自动重启被管server的进程&#xff0c;并且对spring框架提供比直接启动更快的重启速度。 配置步骤&#xff1a; 在管理电脑上&#xff1a; …

导购网站怎么做有特色北京海淀房管局网站

gizp压缩是一种http请求优化方式&#xff0c;通过减少文件体积来提高加载速度。html、js、css文件甚至json数据都可以用它压缩&#xff0c;可以减小60%以上的体积。 webpack在打包时可以借助 compression webpack plugin 实现gzip压缩&#xff0c;首先需要安装该插件&#xff…

勒流网站制作端午节网站建设目的

l 在iOS中想实现一些简单的动画效果&#xff08;平移、缩放、旋转&#xff09;&#xff0c;特别简单 l 你只需要告诉iOS系统&#xff1a;哪些代码造成的改变需要使用动画效果就可以了 [UIView beginAnimations:nil context:nil]; ……需要执行动画效果的代码…… [UIView c…

游戏ui设计网站鞍山网站

Given a string and we have to split into array of characters in Python. 给定一个字符串&#xff0c;我们必须在Python中拆分为字符数组。 将字符串拆分为字符 (Splitting string to characters) 1) Split string using for loop 1)使用for循环分割字符串 Use for loop t…

html5导航网站源码wordpress发表的文章点不开

在主成分分析&#xff08;PCA&#xff09;原理总结中&#xff0c;我们对主成分分析(以下简称PCA)的原理做了总结&#xff0c;下面我们就总结下如何使用scikit-learn工具来进行PCA降维。 一、scikit-learn PCA类介绍 在scikit-learn中&#xff0c;与PCA相关的类都在sklearn.deco…

软件开发顺序wordpress媒体优化

在工作中遇到对接java接口&#xff0c;涉及到java加密或签名问题&#xff0c;.net无法实。就将java代码编辑为dll给.net调用 注&#xff1a;这里只做简单java代码处理&#xff0c;不涉及到复杂的java包 java文件处理&#xff1a; 第一步:简单java代码 package com.zht;//c#命名…

php 怎么做视频网站wordpress 付费注册

转载于:https://www.cnblogs.com/cmyg/p/7206474.html

网站建设:什么是网站开发与建设

1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否…

优化网站用什么软件好做外贸没有企业网站

DFS 蓝桥杯中的DFS主要有针对分配过程的DFS和图/树的DFS两种类型&#xff0c;基本是模板题&#xff0c;难度中等 类型一&#xff1a;针对分配过程的DFS 例题 1&#xff1a;飞机降落 题目描述&#xff1a; N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 T …

西安网站seo外包seo入门讲解

使用docker-compose优雅部署RocketMQ 随着市场的发展&#xff0c;越来越多的复杂场景出现在我们日常的开发工作中。随之也越来越多的好的工具&#xff0c;也同步出现在程序员的学习范围清单内。好的工具提高产品性能的同时&#xff0c;也带来了很多安装上的问题&#xff0c;do…

什么网站百度容易收录线上直播营销策划方案

随着区块链技术的迅速发展和数字资产市场的蓬勃发展&#xff0c;区块链交易所成为了数字资产交易的核心场所之一。在这个快速发展的领域中&#xff0c;区块链交易所App系统的开发和撮合交易系统的建设至关重要。本文将探讨区块链交易所App系统开发及撮合交易系统的重要性&#…

合肥有什么好的网站建设公司win7优化配置的方法

给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 思路&#xff1a;每个循环中&#xff0c;sum表示以nums[i]结尾的最大子序和&#xff0c;res表示目前得到的最大子序和。当循环结…

推广链接网站小程序开发定制公司北京

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a; 磁盘内存 为…

广州网站建设开发公司建设银行深圳天健世纪支行网站

BeetleX针对redis访问封了全async/await操作模式&#xff0c;通过它可以更高效地访问redis服务。BeetleX.Redis提供读写分离和多机故意写入处理&#xff0c;同时安全的TLS访问机制&#xff0c;在使用功能上组件支持绝大部分基础指令&#xff0c;并提供json&#xff0c;protobuf…

手机端网站源码抖音带运营的执行老大

在当今信息化快速发展的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着资料的积累&#xff0c;备份手机数据成了一个重要的问题。本文将介绍iMazing如何备份手机资料&#xff0c;并为大家解答“iPhone的资料可以传到iPad里吗”这一问题。这不仅可以帮助你有效管…

怎么制作网站链接用wordpress做企业门户

网络基础&#xff08;一&#xff09; 文章目录 一、计算机网络背景1.1网络发展1.2认识“协议” 二、网络协议初识2.1OSI七层模型2.2OSI五层模型 三、网络传输基本流程3.1局域网通信3.2网络传输流程不跨子网的网络传输跨子网的网络传输 3.3网络中的地址管理IP地址MAC地址 一、计…

木质家居 技术支持 东莞网站建设自适应式网站模板

RpcProvider&#xff08;服务提供者&#xff09;实现思路 上一节说到&#xff0c;如何将一个本地服务发布成远程服务&#xff0c;但没有说明一个rpc框架怎么进行调用的&#xff0c;看看上节代码 #include <iostream> #include <string> #include "user.pb.h…