leetcode春节假期刷题(二)

继续刷题

常用的函数

s.substring(start,end) 是区间[start,end) 不是区间 [start,end] 区别是end 取没有
Queue 创建 Queue queue = new LinkedList();

Leetcode 5

 Boolean[][] board =  new Boolean[s.length()][s.length()]; 
        for(int i=0;i<s.length();i++){
            for(int j=0;j<s.length();j++){
                if(i==j){
                    board[i][j]=true;
                }else{
                    board[i][j]=false;
                }

            }
        }
        if(s==null||s.length()==0){
            return "";
        }
        if(s.length()==1){
            return s;
        }
        int maxLen=0,start=0,end=0;
        for(int l=2;l<=s.length();l++){
            for(int j=s.length()-1; j>0;j--){
                if(j-l+1>=0&& j+1<=s.length()-1  && board[j-l+1][j]==true && s.charAt(j-l)==s.charAt(j+1)){
                    board[j-l][j+1]=true;
                    if(l>maxLen){
                        maxLen=l;
                        start=j-l;
                        end=j+1;
                    }
                }     
            }
        }
        return s.substring(start,end);

修改后代码变为

 int maxLen=0,start=0,end=0;
        for(int l=1;l<=s.length();l++){
            for(int j=s.length()-1; j>=0;j--){
                if(j-l>=0&& j+1<=s.length()-1  && board[j-l+1][j]==true && s.charAt(j-l)==s.charAt(j+1)){
                    board[j-l][j+1]=true; 
                    if(l+2>maxLen){
                        maxLen=l+2;
                        start=j-l;
                        end=j+1;
                    }       
                }else if(l==2){
                    if(j-l+1>=0 &&s.charAt(j-1)==s.charAt(j)){
                        board[j-1][j]= true;
                        if(l>maxLen){
                            maxLen = l;
                            start = j-1;
                            end = j;
                        }
                    }
                }  
            }
        }
        return s.substring(start,end+1);

依旧有样例过不去
leetcode春节假期刷题(二)
最终

 int len = s.length();
        if (len < 2) {
            return s;
        }

        int maxLen = 1;
        int begin = 0;
        // dp[i][j] 表示 s[i..j] 是否是回文串
        boolean[][] dp = new boolean[len][len];
        // 初始化:所有长度为 1 的子串都是回文串
        for (int i = 0; i < len; i++) {
            dp[i][i] = true;
        }

        char[] charArray = s.toCharArray();
        // 递推开始
        // 先枚举子串长度
        for (int L = 2; L <= len; L++) {
            // 枚举左边界,左边界的上限设置可以宽松一些
            for (int i = 0; i < len; i++) {
                // 由 L 和 i 可以确定右边界,即 j - i + 1 = L 得
                int j = L + i - 1;
                // 如果右边界越界,就可以退出当前循环
                if (j >= len) {
                    break;
                }

                if (charArray[i] != charArray[j]) {
                    dp[i][j] = false;
                } else {
                    if (j - i < 3) {
                        dp[i][j] = true;
                    } else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                }

                // 只要 dp[i][L] == true 成立,就表示子串 s[i..L] 是回文,此时记录回文长度和起始位置
                if (dp[i][j] && j - i + 1 > maxLen) {
                    maxLen = j - i + 1;
                    begin = i;
                }
            }
        }
        return s.substring(begin, begin + maxLen);

需要思考的边界条件
考虑长度小于3 例子"ac"是否能过去 即初始化maxLen的长度
是从长度为2开始枚举目的是4 ,还是从长度为2开始枚举目的是2 (意思就是把l 当作是已知条件,还是结论)

Leetcode 15

 Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        int len=  nums.length;
        if(nums.length<3){
            return  new ArrayList();
        }    
        int begin = 0 ,end =  0;
        for(int i=0;i<nums.length-2;i++){
            if(i>0 && nums[i]==nums[i-1]){
                continue;
            }
            begin =i+1;
            end =len-1;

            while(begin<end){
                if(nums[i]+nums[begin]+nums[end]==0){
                    List<Integer> list  =  Arrays.asList(nums[i],nums[begin],nums[end]);            
                    while(begin<end && nums[begin]==nums[begin+1]){
                        begin++;
                    }
                    while(begin<end && nums[end ]==nums[end-1]){
                        end--;
                    }
                    begin++;
                    end--;
                    res.add(list);
                }else if(nums[i]+nums[begin]+nums[end]<0){
                    begin++;
                }else{
                    end--;
                }
            }

        }
        return res;

注意点 Arrays.asList(),还有跳过重复元素 i>0 && num[i]==num[i-1];

Leetcode 剑指 09

private Stack<Integer> data;
   private Stack<Integer> help;

   public CQueue() {
        data = new Stack<>();
       help = new Stack<>();
   }
   
   public void appendTail(int value) {
       help.push(value);
   }
   
   public int deleteHead() {
       if(!data.isEmpty()){
           return data.pop();
       }
       if(help.isEmpty()){
           return  -1;
       }
       while(!help.isEmpty()){
           data.push(help.pop());
       }
       return data.pop();
   }

需要注意的

Leetcode 225

 private Queue<Integer> data;
   private Queue<Integer> help;  

   public MyStack() {
       data =  new  LinkedList<>();
       help = new LinkedList<>();
   }
   
   public void push(int x) {
       if(data.isEmpty()){
           data.add(x);
       }else{
           while(!data.isEmpty()){
               help.add(data.poll());    
           }
           data.add(x);
           while(!help.isEmpty()){
               data.add(help.poll());
           }
       }

   }
   
   public int pop() {
      return   data.poll();
   }
   
   public int top() {
       return data.peek();
   }
   
   public boolean empty() {
       return  data.isEmpty();
   }

Leetcode 1996

Arrays.sort(properties, (p1,p2)->{
if(p2[0]==p1[0]){
return p1[1]-p2[1];
}
return p1[0]-p2[0];
});
int len = properties.length;
int res = 0;
for(int i = 0 ; i< len ;i++){

        for(int j = i+1  ;  j <  len ; j++){
            if(properties[i][1]<properties[j][1] && properties[i][0] !=properties[j][0] ){
                res++;
                System.out.println(properties[i][0] + " " + properties[j][0]);

                break;
            }
        }

    }
    return res;

解答时间超过限度

上一篇:MyBatisPlusGenerator使用


下一篇:JQueryDom操作