提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Leetcode
93. 复原 IP 地址
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
类似于前一道题 分割回文串
● 看完代码随想录之后的想法
我是用count记录分割次数作为终止条件,用for循环List拼接
● 自己实现过程中遇到哪些困难
代码写得太冗余了,内存占用大,效率低,今天来不及了,以后再改
● 今日收获,记录一下自己的学习时长
很长
class Solution {
List<String> result = new LinkedList<>();
Deque<String> list = new LinkedList<>();
//count代表分割几次
int count = 0;
public List<String> restoreIpAddresses(String s) {
if(s.length()==0 || s.length()>12){
return result;
}
restore(s,0);
return result;
}
public void restore(String s,int start){
//结束条件
if(count>3){
return;
}
if(count==3){
if(isValid(s,start,s.length()-1)){
String st = "";
//将list中的字符串用.拼接,放入result
for(String l:list){
st+=l+".";
}
st+=s.substring(start, s.length());
result.add(st);
return;
}
return;
}
for(int i=start;i<s.length();i++){
//判断开头是否为0 还有大于等于0、小于等于255
if(isValid(s,start,i)){
count++;
//加入list
String str = s.substring(start, i + 1);
list.addLast(str);
restore(s,i+1);
}else{
continue;
}
count--;
//删除list结尾
list.removeLast();
}
}
// 判断字符串s在左闭⼜闭区间[start, end]所组成的数字是否合法
private Boolean isValid(String s, int start, int end) {
if (start > end) {
return false;
}
if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法
return false;
}
int num = 0;
for (int i = start; i <= end; i++) {
if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮数字字符不合法
return false;
}
num = num * 10 + (s.charAt(i) - '0');
if (num > 255) { // 如果⼤于255了不合法
return false;
}
}
return true;
}
}
78. 子集
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
● 看完代码随想录之后的想法
● 自己实现过程中遇到哪些困难
● 今日收获,记录一下自己的学习时长
class Solution {
LinkedList<Integer> list = new LinkedList<>();
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
result.add(new ArrayList<>());
subset(nums,0);
return result;
}
public void subset(int[] nums,int start){
if(start == nums.length){
return;
}
for(int i=start;i<nums.length;i++){
list.add(nums[i]);
//list放入result
result.add(new ArrayList<>(list));
//递归
subset(nums,i+1);
list.removeLast();
}
}
}
90. 子集 II
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
类似前面的树层去重
● 看完代码随想录之后的想法
没看
● 自己实现过程中遇到哪些困难
- Arrays.fill(used,false); 忘了写数组参数
- if(i!=0&&nums[i]==nums[i-1]&&used[i-1]==false){
continue;
}
i写成了start
● 今日收获,记录一下自己的学习时长
补
class Solution {
List<List<Integer>> result = new ArrayList<>();
Deque<Integer> list = new LinkedList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
result.add(new ArrayList<>(list));
if(nums.length==0){
return result;
}
//nums排序
Arrays.sort(nums);
//填充false
Boolean[] used = new Boolean[nums.length];
Arrays.fill(used,false);
subsets(nums,0,used);
return result;
}
public void subsets(int[] nums,int start,Boolean[] used){
if(start==nums.length){
return;
}
for(int i=start;i<nums.length;i++){
if(i!=0&&nums[i]==nums[i-1]&&used[i-1]==false){
continue;
}
list.add(nums[i]);
used[i] = true;
result.add(new ArrayList<>(list));
subsets(nums,i+1,used);
list.removeLast();
used[i] = false;
}
}
}