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

算法训练(leetcode)二刷第二十天 | 93. 复原 IP 地址、78. 子集、90. 子集 II

刷题记录

  • 93. 复原 IP 地址
  • 78. 子集
  • 90. 子集 II

93. 复原 IP 地址

leetcode题目地址

本题和131. 分割回文串思路相似,回溯法进行数字拼接,判断当前数字是否符合要求,若符合则递归寻找下一个字段,若不符合则继续向后拼接。

时间复杂度: O ( 3 4 ) O(3^4) O(34)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {private int curCnt = 0;private List<String> path = new LinkedList<>();private List<String> result = new ArrayList<>();public boolean isValid(StringBuilder sb){// 前导0if(sb.length() > 1 && sb.charAt(0)=='0') return false;int sum=0;for(int i=0; i<sb.length(); i++){sum = sum*10 + sb.charAt(i) - '0';}// 0-255if(sum>=0 && sum<=255) return true;return false;}public void backtracking(String s, int startIdx){if(path.size() == 4 && startIdx >= s.length()){ // StringBuilder res = new StringBuilder();for(String num : path){res.append(num).append('.');}res.deleteCharAt(res.length()-1);result.add(res.toString());return;}StringBuilder sb = new StringBuilder();for(int i=startIdx; i<s.length(); i++){sb.append(s.charAt(i));if(isValid(sb)){path.add(sb.toString());backtracking(s, i+1);path.removeLast();}}}public List<String> restoreIpAddresses(String s) {if(s.length() > 12) return this.result;backtracking(s, 0);return this.result;}
}

78. 子集

leetcode题目地址

经典回溯问题,只是每一步都要放入结果集。

时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {public List<Integer> path = new LinkedList<>();public List<List<Integer>> result = new ArrayList<>();public void backtracking(int[] nums, int startIdx){result.add(new ArrayList<>(path));if(startIdx >= nums.length){return;}for(int i=startIdx; i<nums.length; i++){path.add(nums[i]);backtracking(nums, i+1);path.removeLast();}}public List<List<Integer>> subsets(int[] nums) {backtracking(nums, 0);return result;}
}

90. 子集 II

leetcode题目地址

本题和上题的思路相似,只是多了一个去重的步骤。题目要求不能包含重复的子集,也就是在当前层若有相同元素已经查找过了,则跳过当前元素。需要先对数组排序,这样相同元素就连在一起,每层只查找相同元素中的第一个元素,其他相同元素跳过。

时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {private List<Integer> path = new LinkedList<>();private List<List<Integer>> result = new ArrayList<>();public void backtracking(int[] nums, int startIdx){result.add(new ArrayList<>(path));if(startIdx >= nums.length) {return;}for(int i=startIdx; i<nums.length; i++){// 去重if(i != startIdx && nums[i] == nums[i-1]) continue;path.add(nums[i]);backtracking(nums, i+1);path.removeLast();}}public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);backtracking(nums, 0);return result;}
}

http://www.mrgr.cn/news/68752.html

相关文章:

  • 基于SpringBoot的社区讯息服务小程序【附源码】
  • C++类型推导decltype和auto
  • 深⼊理解指针(3)【数组与指针】
  • 拍立淘API:当购物遇上“读图写话”
  • 江协科技STM32学习- P36 SPI通信外设
  • go语言中package详解
  • 标准遗传算法-c++源程序
  • 从0开始学习机器学习--Day19--学习曲线
  • Moment.js、Day.js、Miment,日期时间库怎么选?
  • leetcode hot100【LeetCode 17.电话号码的字母组合】java实现
  • 快速开发工具 Vite
  • 大模型微调技术 --> IA3
  • LeetCode 每日一题 长度为 K 的子数组的能量值
  • 牛客小白月赛104-D小红开锁-模拟
  • c++:stack,queue,priority_queue模拟实现
  • 软件设计师中级 第9章 数据库技术基础
  • 从零开始学习python 7(持续更新ing)
  • 有趣的Midjourney作品赏析(附提示词)
  • Leetcode 长度最小的子数组
  • 06 Oracle性能优化秘籍:AWR、ASH、SQL trace与实时监控的实战指南
  • git基础操作
  • Python的函数
  • CDN到底是什么?
  • C++算法探索:从排序到动态规划
  • java卷上天,转行可以干什么?
  • 声纹识别中,向量距离那种计算方式最合适