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

win7iis如何做网站郑州网站推广技术

win7iis如何做网站,郑州网站推广技术,国际公司和跨国公司,什么网站做谷歌联盟好文章目录 问题描述错误代码分析原代码实现错误原因 修正方案与代码实现修正后的代码关键修正点 核心问题:为什么 used 不需要回溯?作用域与生命周期示例分析 总结算法设计要点复杂度分析 问题描述 给定一个整数数组 nums,找出并返回所有不同…

文章目录

    • 问题描述
    • 错误代码分析
      • 原代码实现
      • 错误原因
    • 修正方案与代码实现
      • 修正后的代码
      • 关键修正点
    • 核心问题:为什么 `used` 不需要回溯?
      • 作用域与生命周期
      • 示例分析
    • 总结
      • 算法设计要点
      • 复杂度分析

问题描述

给定一个整数数组 nums,找出并返回所有不同的非递减子序列。子序列中至少有两个元素,且各元素保持相对顺序(非递减)。

示例

  • 输入:nums = [4,6,6]
  • 输出:[[4,6], [4,6,6], [6,6]]

错误代码分析

原代码实现

class Solution {public List<List<Integer>> findSubsequences(int[] nums) {List<List<Integer>> result = new ArrayList<>();backTrack(result, new ArrayList(), nums, 0);return result;}public void backTrack(List<List<Integer>> result, List<Integer> path, int[] nums, int index) {if (path.size() > 1) {result.add(new ArrayList(path));}for (int i = index; i < nums.length; i++) {if (path.size() > 0 && nums[index] < path.get(path.size() - 1)) {continue;}path.add(nums[i]);backTrack(result, path, nums, i + 1);path.remove(path.size() - 1);}}
}

错误原因

  1. 非递减条件错误

    • 错误代码nums[index] < path.getLast()
    • 问题index 是递归的起始位置,而实际应该比较的是当前元素 nums[i] 与路径末尾元素。
    • 后果:错误地跳过了有效的子序列。
  2. 缺少去重逻辑

    • 问题:未处理同一层级的重复元素,导致生成重复子序列。例如输入 [4,6,6] 会生成两个 [4,6]
    • 后果:结果集中包含重复答案。

修正方案与代码实现

修正后的代码

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;class Solution {public List<List<Integer>> findSubsequences(int[] nums) {List<List<Integer>> result = new ArrayList<>();backTrack(result, new ArrayList<>(), nums, 0);return result;}public void backTrack(List<List<Integer>> result, List<Integer> path, int[] nums, int index) {if (path.size() > 1) {result.add(new ArrayList<>(path));}Set<Integer> used = new HashSet<>(); // 关键:记录当前层已使用的元素for (int i = index; i < nums.length; i++) {// 1. 非递减检查:当前元素必须 >= 路径末尾元素if (!path.isEmpty() && nums[i] < path.get(path.size() - 1)) {continue;}// 2. 同一层级去重:跳过已使用的元素if (used.contains(nums[i])) {continue;}used.add(nums[i]);path.add(nums[i]);backTrack(result, path, nums, i + 1);path.remove(path.size() - 1); // 回溯}}
}

关键修正点

  1. 非递减条件修正

    • nums[index] 改为 nums[i],确保比较的是当前元素与路径末尾元素。
  2. 引入去重逻辑

    • 使用 Set<Integer> used 记录当前层级已使用的元素,避免重复选择。例如 [4,6₁,6₂] 中,同一层级的 6₁6₂ 会被去重。

核心问题:为什么 used 不需要回溯?

作用域与生命周期

  • used 集合的生命周期

    • used 在每次进入新的递归层级时(即每次调用 backTrack 方法时)被重新创建。
    • 当递归返回到父层级时,当前层级的 used 会被销毁,子层级的 used 不影响父层级。
  • path 需要显式回溯的原因

    • path 是跨层级共享的。在递归过程中,子层级对 path 的修改会直接影响父层级的状态,因此必须通过 remove 操作撤销修改。

示例分析

以输入 nums = [4,6,6] 为例:

  1. 父层级(index=0)

    • 选择 4,进入子层级(index=1)。
    • 子层级的 used 是独立的新集合。
  2. 子层级(index=1)

    • used 初始化为空。
    • 处理 i=1(元素 6₁):
      • used 添加 6₁path 变为 [4,6₁]
      • 继续递归,收集有效子序列 [4,6₁]
    • 回溯后,path 恢复为 [4]
    • 处理 i=2(元素 6₂):
      • used 包含 6₁,因此跳过 6₂,避免重复。

总结

算法设计要点

  1. 非递减检查:确保子序列的每个新元素不小于路径末尾元素。
  2. 层级去重:通过 used 集合避免同一层级选择重复元素。
  3. 递归与回溯:显式维护 path 的状态,保证不同分支的独立性。

复杂度分析

  • 时间复杂度:O(2^N * N),N 为数组长度。
  • 空间复杂度:O(N),递归栈深度最大为 N。
http://www.dtcms.com/wzjs/411911.html

相关文章:

  • 网站开发时间表2022最近十大的新闻热点
  • 红色专题网站首页模板女教师遭网课入侵视频大全播放
  • 网站建设公司哪家强怎么让关键词快速排名首页
  • 国内顶级网站制作公司百度统计怎么使用
  • 眼镜东莞网站建设网络公司有哪些
  • 网站源码安全吗360优化大师官方最新
  • 想自己搞一个视频网站怎么做seo优化网站网页教学
  • wordpress优化方案网站关键词优化公司
  • 网站建设服务项目表格网站seo工具
  • 在什么网站上兼职做加工中心编程世界足球排名前100
  • 邯郸做网站流程百度推广开户多少钱一个月
  • 网站解析怎么设置电商网站建设价格
  • 网页广告图整站优化排名
  • 企业官网建设费用南昌seo网站排名
  • 邵阳网站开发网站建设价格
  • 教人做甜品的网站百度精简版入口
  • 哪个网站做课件ppt比较好2345中国最好的网址站
  • 北京网站建设哪便宜百度登陆
  • 网站开发与iso9001关系网优工程师前景和待遇
  • 唐山建设集团下岗职工网站网络广告的形式
  • 做网站做得好的公司有哪些中国企业500强最新排名
  • 西安搬家公司收费seo排名软件
  • 做网站的的人收入多少钱网上培训机构
  • 关于校园网站设计的毕业论文google关键词优化
  • 用java做直播网站谷歌关键词搜索工具
  • 手表网站错误怎么办巩义网络推广外包
  • 婚礼策划方案seo优化工具软件
  • 网址导航类网站怎么做店铺引流的30种方法
  • 福州做网站互联网公司排名网络营销推广主要做什么?
  • 深圳电商网站开发公司上海比较好的seo公司