- 博客(33)
- 收藏
- 关注
原创 LeetCode每日一题-2021-06-22-剑指 Offer 38. 字符串的排列
个人思路此题和昨天的题类似都是用回溯做法求全排列,但是不同给的是,这个给定的字符串里可能有重复的字母,但是要求输出的字符串列表又不能有重复,如何用回溯算法解决排列(组合)去重问题判断一个字符串是否包含某个字符,有indexOf和contains方法,注意两者的区别不会解决,直接看题解官方题解会看之前的回溯模板 List<E> res = new ArrayList<>(); void backtrack(/*路径*/,/*选择列表*/, /*路径终止条件*/.
2021-06-23 17:18:53 109
原创 LeetCode每日一题-2021-06-23-剑指 Offer 15. 二进制中1的个数
在北京star see出差期间做的两道汉明距离题,最早的一篇笔记里应该有n & n-1n * ( k - n )
2021-06-23 14:56:32 98
原创 Leetcode每日一题-2021-06-21-401. 二进制手表
我的思路返回可能的所有时间,即穷举,考虑回溯算法回溯算法,labuladong给的套路如下:List<E> result = new ArrayList<>();void backtrack(路径,选择列表){ if(满足结束条件){ result.add(路径); return ; } for( 选择 : 选择列表 ){ 做选择; backtrack(更新的路径,选择列表); 撤销选择;//路径回退 }}两种回溯针对组合问题的回溯.
2021-06-21 20:47:18 137 2
原创 LeetCode每日一题-2021-06-19-1239. 串联字符串的最大长度
个人思路出现次数可以用一个int数组来表示,关键问题是如何找到最长的串联字符串,最长想到动态规划如果用动态规划的话,状态定义为最长长度,如果数组中至少有一个无重复字符串,则组成的最长字符串的最后一个字符串,一定是这几个字符串中的一个,然后这个最后的字符串的长度+除去这个字符串剩余数组中的最长,即可得到转移方程关键就是这个除去的剩余数组怎么表示,看起来像某种背包问题,每个石头只能选一次。做不出来,直接看题解了题解位运算的使用:将每个字符串表示为一个二进制数,二进制的第i位表示有无这个字符,.
2021-06-20 00:00:09 107 2
原创 LeetCode每日一题-2021-06-18-483. 最小好进制
个人思路好进制一定在[2, n-1]之间若n的好进制是k,那么应该存在一个i使得pow(k, i)/(i-1) == n,其中i在[2, 60]之间,也就是1的个数,为啥是60,因为最大值是1e18
2021-06-18 15:32:28 104
原创 2021-06-17-Java的正则表达式
import java.util.regex.*;import java.util.regex.Pattern;import java.util.regex.Matcher;String regular;//正则表达式Pattern p = Pattern.compile(regular);//创建正则表达式对象p.pattern();//返回正则表达式字符串形式,标准形式p.split();//按照所给正则表达式分割//p.matcher()Matcher m = p.matcher(g
2021-06-18 00:04:02 152
原创 LeetCode每日一题-2021-06-17-65. 有效数字
两种方法,一种是状态自动机,一种是正则表达式,都不会直接copy了,还有一种模拟的方法记录一下正则表达式的写法正则表达式测试网站题意:一个整数或者小数 +(可选)(e/E + 一个整数)几部分分别定义一个整数一个可选的符号位,至少一个数字位[+-]?\d+一个小数//三种小数第一种:一个可选的符号位,至少一位数字,小数点 [+-]?\d+.第二种:一个可选的符号位,至少一位数字,小数点,至少一位数字 [+-]?\d+.\d+上面两种其实可以合并为一个 [+-]?\d.
2021-06-17 22:37:35 80
原创 LeetCode每日一题-2021-06-15-877. 石子游戏-486. 预测赢家
博弈论问题,衡为true,我猜的如果是偶数确实先手必赢,现在考虑更为普适的奇偶都有的情况这类题型为区间DP或者双人博弈状态与子问题dp[i][j]: 定义为两个玩家对弈,即先手后手对弈,对弈区间为scores[i:j],在区间上两个人的最大分数差(先手总分数-后手总分数),易判断i一定得小于等于j,等于的时候区间缩为一个点对于当前先手玩家,他只有两种选择,拿最左边的scores[i]或者最右边的socres[j]∮当前先手玩家选择scores[i],那么后手玩家只能在scores[i+1:.
2021-06-16 21:55:05 189
原创 LeetCode每日一题-2021-06-14-852. 山脉数组的峰顶索引
两段条件法 while( left < right ){ int mid = left + (right -left >> 1); if( ){ //答案在左区间 right = mid; }else{ //答案在右区间 left = mid + 1; } } //left == right return left;三段条件法 while( left < right ){ int mid = left + (right -lef..
2021-06-15 09:36:53 74
原创 LeetCode每日一题-2021-06-14-374. 猜数字大小
题目表意不清不贴了,直接总结二分的几个经典题目模型二分查找,查找的值一定存在 int left = 1, right = n; while( left < right ){//循环终止条件是 left == right int mid = left + (right - left >> 1 ); if( nums[mid] >= target ){//目标值在左区间 [left, mid] right = mid; }else{//目标值在右区间 [mid
2021-06-14 14:26:46 139
原创 LeetCode每日一题-2021-06-13-278. 第一个错误的版本
尽量减少调用次数,应该用的是二分引用一句话Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky…while( left <= right){ mid = (left + right) / 2; if( ){ right = mid - 1; }else{ left = mid + 1; }}主要是.
2021-06-13 21:16:49 150
原创 LeetCode每日一题-2021-06-12-1449. 数位成本和为目标值的最大数字
状态及子问题假设成本为target构成最大整数的最后一个数位是number,则剩下的最大整数为成本是target-cost[number],因此状态:f(target) 为成本target的最大整数子问题,f(target - cost[i]) 为成本target-cost[i]的最大整数当然由于结果是字符串,应该还有一个判断两个数哪个大的函数状态转移方程f(i) = max( f(i - cost[k]) + k+1) k=1……9这里错误,因为要正好用target成本,如何保证...
2021-06-12 13:37:55 112
原创 LeetCode每日一题-2021-06-11-279完全平方数
确定状态及子问题状态:dp[n]表示和为n的完全平方数的最少数量子问题:假设最后一个完全平方数为number,则求和为n-number的完全平方数的最小数量即dp[n-number]状态转移方程dp[i] = min( dp[i - n1]+1, dp[i - n2]+1, …, dp[i - n100]+1 )初始值及边界条件dp[1] = 1;实际上应该是dp0 = 0,因为有正好是完全平方数的数且dp[i]最大为i个1相加计算顺序从小到大以上为动态规划解题...
2021-06-11 11:19:21 240 2
原创 LeetCode每日一题-2021-06-10-零钱兑换2
动态规划之计数问题确定状态以及子问题状态:兑换某个数额amount的组合总数子问题:假设最后一个硬币用的是coins[k],则问题变为兑换某个数额amount-coins[k]的组合总数,其中coins可能很多面额的硬币状态转移方程dp[i] = sum( dp[ i - coins[j] ] )初始状态dp[0] = 1计算顺序从小到大问题1:如何去重交换内外循环,排列就变为组合问题了...
2021-06-10 22:53:29 89 1
原创 LeetCode-每日一题2021-05-27-461-477-汉明距离
LeetCode-461两数汉明距离,首先想到异或 ^,异或之后求一个二进制数有几个1,两种方法,经典方法挨个位判断和题解方法z&(z-1)LeetCode-477多数汉明距离,如何效率求得n个数两两之间的汉明距离,如果还是异或,两两之间两层循环,异或求1一层循环共三层,直接超时。纵向思考nums[0] = 0 1 0 1 0 1 1nums[1] = 0 1 0 1 0 1 0nums[2] = 1 0 1 1 1 1 1nums[3] = 1 0 0 1 0 0 0nums[4]
2021-05-28 11:39:38 87
原创 2021-05-21
boy.marry(this); this符合参数列表是一个对象封装性的体现:①private属性+get/set ②private方法 ③单例模式,构造器私有化 ④default类四种权限修饰符:private<default<protected<public,能修饰什么,修饰以后有什么权限构造器没有返回值,方法有...
2021-05-21 15:16:52 60
原创 2021-04-21
1.创建类对象数组 Student[] s = new Student[20]; for (int i = 0; i < s.length; i++) { s[i] = new Student(); s[i].name = "student" + i; s[i].number = i+1; }错误示例: Student[] s = new Student[20]; for (int i = 0; i <
2021-04-22 15:31:38 49
原创 2021-04-14
数组的初始化:静态初始化和动态初始化,动态初始化会默认初始化值注意char里面的就是0,而不是字符‘0’,引用数据类型就是空指针null,而不是字符串“null”
2021-04-13 20:52:02 48
原创 2021-04-13
下面展示一些 内联代码片。flag = true;while(flag){ // flag = false;}break和continue后面是不能声明执行语句的,会报错带有flag的循环,当前循环结束记得重置flagchar c = s.charAt(0);while(true){ if( c != 'y' || c != 'n' ){ sout("wrong input"); }else{ break; }}func(c);...
2021-04-13 15:28:56 42
原创 2021-03-19
自动类型转换这里的容量大小指的是数的范围的大小,而不是内存前三种变量相互做运算,结果为int注意:long的L不加可能是正确的,不加默认为int,因为long>int,将long自动认为是int了,但是float不加F一定编译错误,因为不加默认double,double转float有精度损失。因此默认的类型是int和doubleStringstring可以和其他八种类型做运算,比如“+”连接运算,其他类型直接变成string...
2021-03-22 11:09:37 40
原创 2021-03-18
变量必须声明且赋值同理声明float末尾要加“F”或者“f”float表示的范围比long还大ASCII 以及Unicode(UTF-8)ASCII a→97 A→65
2021-03-18 15:28:17 38
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人