代码
1、长度最小的子数组⭐
使用滑动窗口的思想,外层循环控制结束位置j,内层循环控制起始位置i,看似是双层循环,但时间复杂度是o(2n)。
2、水果成篮
自己想法:使用backet1
和backet2
表示篮子1和篮子2;使用backet1Account
和backet2Account
分别表示两个篮子里水果的数量,内层循环将i指针向前移动。
public int totalFruit(int[] fruits) {
int backet1=fruits[0];
int backet2=0;
int backet1Account=0;
int backet2Account=0;
int result=0;
int i=0;
for (int j = 0; j < fruits.length; j++) {
if (fruits[j]==backet1){
backet1Account++;
}else if (fruits[j]==backet2 ||backet2Account==0 ){
backet2=fruits[j];
backet2Account++;
}else{
while (backet1Account>0 && backet2Account>0){
if (fruits[i]==backet1){
backet1Account--;
}else {
backet2Account--;
}
i++;
}
if (backet1Account==0){
backet1=fruits[j];
backet1Account++;
}
if(backet2Account==0){
backet2=fruits[j];
backet2Account++;
}
}
result=result>backet1Account+backet2Account?result:backet1Account+backet2Account;
}
return result;
}
最优想法:不需要单独设置表示两个篮子里水果数量的参数,一旦下一个水果不在已有篮子里,i=j-1;内层循环将i指针向前移动,得到i位置后,将i位置的水果放入篮子1,当前j位置的水果放入篮子2,总的数量用下标表示。
public int totalFruit(int[] fruits) {
int backet1=fruits[0];
int backet2=0;
int result=0;
int i=0;
for (int j = 0; j < fruits.length; j++) {
if (fruits[j]!=backet1 && fruits[j]!=backet2){
i=j-1;
while(i>=1 && fruits[i]==fruits[i-1]){
i--;
}
backet1=fruits[i];
backet2=fruits[j];
}
result=result>(j-i+1)?result:(j-i+1);
}
return result;
}
视频
-
常用类和基础API
1、dtf=DateTimeFormatter.ofPattern("自定义格式");
dtf.format(date); //时间转为字符串 dtf.parse(字符串); //字符串转为时间
2、单独定义的对象类不能会和测试方法放在同一个类中,单开一个测试类,里面写测试方法。
其中当本对象的价格大于比较对象的价格时,value是正数,为从小到大的顺序排列。
要想从大到小排列,return -value;
if (o instanceof Product){
Product p=(Product) o;
int value=Double.compare(this.pricec,p.pricec);//基本数据直接用compare方法进行比较
if (value!=0){
return value;
}
return this.name.compareTo(p.name);//引用类型数据用compareTo方法进行比较
}
//如果不是商品类型则手动抛出异常
throw new RuntimeException("类型不匹配");
3、comparable
让自定义类可以进行排序 在自定义类的内部实现,对应的抽象方法compareTo(Object obj),