当前位置: 首页 > wzjs >正文

学院网站建设的需求分析深圳买门的网站建设

学院网站建设的需求分析,深圳买门的网站建设,汕头网站制作公司,免费crm客户管理系统破解版(优先整理热门100及面试150,不定期持续更新,欢迎关注) 322. 零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何…

(优先整理热门100及面试150,不定期持续更新,欢迎关注)


322. 零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1
你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 

解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 2^31 - 1
  • 0 <= amount <= 10^4

方法一:动态规划

使用动态规划数组 dp,其中 dp[i] 表示凑成金额 i 所需的最少硬币个数。通过逐步填充 dp 数组,最终得到 dp[amount] 的结果。

  1. 初始化

    • dp[0] = 0:金额为0时不需要任何硬币。
    • 其他金额初始化为 amount + 1,因为最多需要 amount 个硬币(全用面额1的硬币),初始值设为更大的数表示暂时不可达。
  2. 状态转移

    • 对于每个金额 i,遍历所有硬币面额 coin
    • coin ≤ i,则可以通过 i - coin 的金额加上当前硬币组成 i,即 dp[i] = min(dp[i], dp[i - coin] + 1)
  3. 结果判断

    • 如果最终 dp[amount] 仍大于 amount,说明无法凑出目标金额,返回 -1
    • 否则返回 dp[amount],即最少硬币数。

代码实现(Java)

import java.util.Arrays;class Solution {public int coinChange(int[] coins, int amount) {if (amount == 0) {return 0;}int[] dp = new int[amount + 1];Arrays.fill(dp, amount + 1); // 初始化为一个较大的值(超过最大可能硬币数)dp[0] = 0; // 金额0需要0个硬币// 遍历所有金额,从1到amountfor (int i = 1; i <= amount; i++) {// 遍历所有硬币面额for (int coin : coins) {if (coin <= i) { // 硬币面额不超过当前金额时,才可能使用dp[i] = Math.min(dp[i], dp[i - coin] + 1);}}}// 判断结果是否有效return dp[amount] > amount ? -1 : dp[amount];}
}

方法二:BFS解法

将问题转化为图的最短路径问题,其中每个节点表示当前剩余金额,边表示使用一枚硬币。BFS按层遍历,首次到达金额0时的层数即为最少硬币数。

  1. 初始化

    • 队列存放待处理的金额,初始为 amount
    • 已访问集合 visited 防止重复处理相同金额。
    • steps 记录当前层数(即已用硬币数)。
  2. 层序遍历

    • 每层开始前记录队列大小,处理完该层所有节点后步数+1。
    • 对每个金额尝试所有硬币:
      • current - coin == 0,直接返回当前步数。
      • 若新金额合法且未访问过,加入队列并标记,避免重复处理相同金额。
  3. 终止条件

    • 队列清空时仍未找到解,返回 -1

代码实现(Java)

import java.util.*;class Solution {public int coinChange(int[] coins, int amount) {if (amount == 0) return 0;Queue<Integer> queue = new LinkedList<>();Set<Integer> visited = new HashSet<>();queue.offer(amount);visited.add(amount);int steps = 0;while (!queue.isEmpty()) {int size = queue.size();steps++;for (int i = 0; i < size; i++) {int current = queue.poll();for (int coin : coins) {int next = current - coin;if (next == 0) {return steps; // 找到解,直接返回}if (next > 0 && !visited.contains(next)) {visited.add(next);queue.offer(next);}}}}return -1; // 队列清空仍未找到解}
}

复杂度分析

  • 动态规划时间复杂度:外层循环:O(amount),内层循环:O(coins.length),总复杂度:O(amount * coins.length)
  • BFS时间复杂度:最坏情况:O(amount * coins.length),实际效率取决于硬币面额分布,大额硬币可能加速收敛。

对比总结

方法优势劣势
BFS无需预计算所有状态,快速收敛空间复杂度高(队列膨胀)
动态规划适合多次查询,空间可控需遍历全部状态

347. 前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按任意顺序返回答案。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶: 你所设计算法的时间复杂度必须优于 O(n log n) ,其中 n 是数组大小。

方法一:最小堆(优先队列)

使用最小堆维护当前频率最高的k个元素,遍历时保持堆的大小不超过k,时间复杂度为O(n log k)

  1. 统计频率:使用哈希表记录每个元素的出现次数。
  2. 维护最小堆:将元素按频率加入堆,堆大小超过k时移除堆顶(最小频率元素)。
  3. 提取结果:堆中剩余的元素即为前k高的频率元素。

代码实现(Java)

class Solution {public int[] topKFrequent(int[] nums, int k) {// 统计频率Map<Integer, Integer> freqMap = new HashMap<>();for (int num : nums) {freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);}// 创建最小堆,按频率升序排序PriorityQueue<Map.Entry<Integer, Integer>> heap = new PriorityQueue<>((a, b) -> a.getValue() - b.getValue());// 维护堆的大小为kfor (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) {heap.offer(entry);if (heap.size() > k) {heap.poll();}}// 提取结果int[] res = new int[k];int idx = 0;while (!heap.isEmpty()) {res[idx++] = heap.poll().getKey();}return res;}
}

方法二:桶排序

基于频率的桶排序,时间复杂度为O(n),适合处理大数据量。

  1. 统计频率:记录每个元素出现的次数及最大频率。
  2. 构建频率桶:将元素按频率存入对应桶中。
  3. 逆序收集结果:从高频率到低频率遍历桶,收集前k个元素。

代码实现(Java)

class Solution {public int[] topKFrequent(int[] nums, int k) {// 统计频率Map<Integer, Integer> freqMap = new HashMap<>();for (int num : nums) {freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);}// 创建桶数组List<Integer>[] bucket = new List[nums.length + 1];for (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) {int freq = entry.getValue();if (bucket[freq] == null) {bucket[freq] = new ArrayList<>();}bucket[freq].add(entry.getKey());}// 收集结果int[] res = new int[k];int idx = 0;for (int i = bucket.length - 1; i >= 0 && idx < k; i--) {if (bucket[i] != null) {for (int num : bucket[i]) {res[idx++] = num;if (idx == k) break;}}}return res;}
}

复杂度分析

1、最小堆

  • 时间复杂度:O(n log k),其中n为数组长度,k为结果数量。
    空间复杂度:O(n),哈希表和堆的空间。
  • 优点:空间占用相对较低,适合k较小的情况。
    缺点:当k接近n时,时间复杂度接近O(n log n)

2、桶排序

  • 时间复杂度:O(n),所有操作均为线性时间。
    空间复杂度:O(n),桶数组和哈希表的空间。
  • 优点:时间复杂度严格为O(n),适合大数据量。
    缺点:需要额外空间存储桶,最大频率较高时空间占用大。

394. 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

提示:

  • 1 <= s.length <= 30
  • s 由小写英文字母、数字和方括号 '[]' 组成
  • s 保证是一个有效的输入
  • s 中所有整数的取值范围为 [1, 300]

方法:栈辅助法

利用栈来处理嵌套的括号结构,保存每层括号外的字符串和重复次数。遍历字符串时解析数字,遇到左括号时将当前状态压栈,遇到右括号时弹出栈顶元素进行字符串拼接。

  1. 初始化栈和变量:使用两个栈分别保存当前层的字符串和重复次数,当前字符串和数字变量记录正在处理的部分。
  2. 遍历字符
    • 数字:累加计算多位数。
    • 左括号:压栈当前字符串和数字,重置变量。
    • 右括号:弹出栈顶的字符串和数字,将当前字符串重复后拼接。
    • 字母:直接追加到当前字符串。
  3. 返回结果:最终拼接完成的字符串即为答案。

代码实现(Java)

class Solution {public String decodeString(String s) {Stack<Integer> numStack = new Stack<>();Stack<StringBuilder> strStack = new Stack<>();StringBuilder currentStr = new StringBuilder();int num = 0;for (char c : s.toCharArray()) {if (Character.isDigit(c)) {num = num * 10 + (c - '0');} else if (c == '[') {strStack.push(currentStr);numStack.push(num);currentStr = new StringBuilder();num = 0;} else if (c == ']') {int k = numStack.pop();StringBuilder prevStr = strStack.pop();String temp = currentStr.toString();prevStr.append(temp.repeat(k));currentStr = prevStr;} else {currentStr.append(c);}}return currentStr.toString();}
}

复杂度分析

  • 时间复杂度O(n × m),其中n是字符串长度,m是最大重复次数。每个字符处理一次,字符串拼接的时间取决于重复次数。
  • 空间复杂度O(n),栈的深度最坏情况下与字符串长度成线性关系。

博客源文件Gitee仓库:

gitee.com/richardmilos/allen-csdn-notes

(持续更新,未完待续)


文章转载自:

http://0cL0ifeC.rrqbm.cn
http://7afdUbkc.rrqbm.cn
http://pZ8l1Czg.rrqbm.cn
http://ic0hkDEZ.rrqbm.cn
http://aPD0mDC5.rrqbm.cn
http://S0neU20m.rrqbm.cn
http://0M3AqH9f.rrqbm.cn
http://h79KnlZi.rrqbm.cn
http://dgiRWK3K.rrqbm.cn
http://oIlhiULP.rrqbm.cn
http://e5HKImOW.rrqbm.cn
http://g2ZKS3eJ.rrqbm.cn
http://4j39HufB.rrqbm.cn
http://sdstgCMl.rrqbm.cn
http://QYl7GnCw.rrqbm.cn
http://kqTF7yY1.rrqbm.cn
http://aEclDvqE.rrqbm.cn
http://zIPb4sbc.rrqbm.cn
http://gknVThnz.rrqbm.cn
http://G3Txaavr.rrqbm.cn
http://EqlMf0WR.rrqbm.cn
http://oYrLjEPF.rrqbm.cn
http://NH7up2sP.rrqbm.cn
http://83ovKz8A.rrqbm.cn
http://tSd7dQDv.rrqbm.cn
http://SfVBo48X.rrqbm.cn
http://pGRqlqtr.rrqbm.cn
http://aoQmsUgz.rrqbm.cn
http://UL2p7ZHm.rrqbm.cn
http://tIt02evU.rrqbm.cn
http://www.dtcms.com/wzjs/637779.html

相关文章:

  • 玉林网站建设培训网站建设与管理培训总结
  • 灵璧网站建设wordpress 设置404
  • 自己电脑做网站服务器广域网访问山东公司网站开发
  • 设计师的网站网站维护要学多久
  • 电商设计的工作内容肇庆网站关键词优化
  • 厦门市建设与管理局 官方网站贵州省建设厅考证官方网站
  • 网站设计网站设计网站设计如何搭建购物平台
  • 中文网站建设技术wordpress论坛查看用户密码
  • 湖南张家界网站建设旅游示范校建设专题网站
  • 重庆做蔬菜配送的网站有哪些修改wordpress模板
  • 成都网站建设司能打开所有网址的浏览器
  • 手机网站你懂wordpress插件的安装目录
  • 网站建设与管理需要哪些证书想接做网站的单子
  • html怎么做网站首页2021年中国十大电商平台排名
  • 佛山免费网站建设seo 网站树
  • 专业网站建设设计考研培训机构排名前十
  • 怎样做网站背景网站生成pc应用
  • 安徽索凯特建设工程有限公司网站天津 论坛网站制作公司
  • 自贡住房和城乡建设厅网站vps网站打开需要身份验证
  • 邯郸网络运营中心电话多少郑州seo公司
  • 网站代理怎么设置免费网络推广网站大全
  • 做网站买什么笔记本好个人简历表格模板
  • 华为公司网站建设方案上海网站建设开发
  • 做设计的一般在什么网站找素材公司logo墙
  • 茂名网站建设托管用爬虫做数据整合网站
  • 唐山建站方案房管局网站做房查
  • 宁波网站建设就找荣胜自己做的微课上传到哪个网站
  • 怎么在windows做网站莱芜吧贴吧
  • 乐陵网站服务在哪一条企业logo设计说明
  • 网站设计报价怎么做flash网站as