zoukankan      html  css  js  c++  java
  • leetcode (栈->中等) 341,385,394,402,456,735

    341

      如果用栈应该就是这样解决,当然也可以直接用个list顺序递归往里面加就可以了

    /**
     * // This is the interface that allows for creating nested lists.
     * // You should not implement it, or speculate about its implementation
     * public interface NestedInteger {
     *
     *     // @return true if this NestedInteger holds a single integer, rather than a nested list.
     *     public boolean isInteger();
     *
     *     // @return the single integer that this NestedInteger holds, if it holds a single integer
     *     // Return null if this NestedInteger holds a nested list
     *     public Integer getInteger();
     *
     *     // @return the nested list that this NestedInteger holds, if it holds a nested list
     *     // Return null if this NestedInteger holds a single integer
     *     public List<NestedInteger> getList();
     * }
     */
    public class NestedIterator implements Iterator<Integer> {
    
        LinkedList<NestedInteger> stack;
    
        public NestedIterator(List<NestedInteger> nestedList) {
             this.stack = new LinkedList<>();
            fill(nestedList);
        }
    
        private void fill(List<NestedInteger> nestedList ){
            for (int i = nestedList.size()-1; i >= 0 ; i--) {
                if (nestedList.get(i).isInteger()){
                    stack.push(nestedList.get(i));
                }else {
                    fill(nestedList.get(i).getList());
                }
    
            }
        }
    
        @Override
        public Integer next() {
             return stack.pop().getInteger();
        }
    
        @Override
        public boolean hasNext() {
             return !stack.isEmpty();
        }
    }
    
    /**
     * Your NestedIterator object will be instantiated and called as such:
     * NestedIterator i = new NestedIterator(nestedList);
     * while (i.hasNext()) v[f()] = i.next();
     */

    385  性能很low。。。

    /**
     * // This is the interface that allows for creating nested lists.
     * // You should not implement it, or speculate about its implementation
     * public interface NestedInteger {
     *     // Constructor initializes an empty nested list.
     *     public NestedInteger();
     *
     *     // Constructor initializes a single integer.
     *     public NestedInteger(int value);
     *
     *     // @return true if this NestedInteger holds a single integer, rather than a nested list.
     *     public boolean isInteger();
     *
     *     // @return the single integer that this NestedInteger holds, if it holds a single integer
     *     // Return null if this NestedInteger holds a nested list
     *     public Integer getInteger();
     *
     *     // Set this NestedInteger to hold a single integer.
     *     public void setInteger(int value);
     *
     *     // Set this NestedInteger to hold a nested list and adds a nested integer to it.
     *     public void add(NestedInteger ni);
     *
     *     // @return the nested list that this NestedInteger holds, if it holds a nested list
     *     // Return empty list if this NestedInteger holds a single integer
     *     public List<NestedInteger> getList();
     * }
     */
    class Solution {
        public NestedInteger deserialize(String s) {
                   LinkedList<NestedInteger> stack = new LinkedList<>();
            NestedInteger node = new NestedInteger();
            stack.push(node);
            String sb = "";
            for (int i = 0; i < s.length(); i++) {
                char tp = s.charAt(i);
                if (tp == '['){
                    NestedInteger peek = stack.peek();
                    NestedInteger nets = new NestedInteger();
                    peek.add(nets);
                    stack.push(nets);
                }else if (tp == ']'){
    
                    NestedInteger pop = stack.pop();
                    if (sb.length() == 0){
                        continue;
                    }
                    NestedInteger nest = new NestedInteger();
                    pop.add(nest);
                    nest.setInteger(Integer.valueOf(sb.toString()));
                    sb="";
    
                }else if (tp == ','){
                    NestedInteger pop = stack.peek();
                    if (sb.length() == 0){
                        continue;
                    }
                    NestedInteger nest = new NestedInteger();
                    pop.add(nest);
                    nest.setInteger(Integer.valueOf(sb));
                    sb="";
                }else {
                    sb =sb +s.charAt(i);
                }
    
    
            }
            if (sb.length() != 0){
                return new NestedInteger(Integer.valueOf(sb));
            }
            NestedInteger pop = stack.pop().getList().get(0);
            return pop;
        }
    }

    394 一位大佬的思路,应该就是用一个字符串变量表示每次遇到 “ ] ”时前面的字符串  然后用栈顶元素加上这个字符串应该有的倍数

        public static String decodeString(String s) {
            int k = 0;
            LinkedList<String> stack = new LinkedList<>();
            LinkedList<Integer> stackCount = new LinkedList<>();
    
            String str = "";
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (c == '['){
                    stackCount.push(k);
                    stack.push(str);
                    k = 0;str= "";
                }else if (c == ']'){
                    Integer pop = stackCount.pop();
                    String pop1 = stack.pop();
                    while (pop > 0){
                        pop1 = pop1 + str;
                        pop--;
                    }
                    str = pop1;
    
                }else if (c >= 48 && c <= 57){
                    k = k*10+(c-48);
                }else {
                    str+=c;
                }
            }
    
            return str;
        }

    402  标签是栈但我想的是从左开始每次找到可选择里面最小的那个 然后直到结束,例如案例中1432219中移除3个 ,那么第一个数字明显只能在1432中选择  如果再选择后面的那么将三个3个移除名额即使都用了也是不够的。

      前面4个数字1最小所以选1,此时没有使用移除名额

      在4322中选择最小的数2(第一个2),那么需要移除43,此时移除名额只剩一个

      在219中选择最小的数1,那么需要移除2,此时无名额,字符串还剩一个9

      答案为1+2+1+9=1219

       代码为如下但是因为这样的话复杂度偏高,只打败了10%的人。。。

        private static String remove(String num,int k){
            if (num.length() == k)return "0";
            int tp = k;
            String res = "";
            for (int i = 0; i < num.length() && res.length() < num.length()-tp; i++) {
                Character s = null;
                int p = 0;
                for (int j = 0; j < k + 1 && (i + j)< num.length(); j++) {
                    char c1 = num.charAt(i + j);
                    if (s == null || c1 < s){
                        s = c1;
                        p = j;
                    }
                }
                i+=p;
                res+= s;
                k-=p;
            }
            while (res.length() != 1 && res.startsWith("0")){
                res = res.substring(1);
            }
            return res;
        }

    456  这题用暴力模式解起来倒是很方便,不过这样的话时间复杂度大约应该是O(n^2)

      

      

        public static boolean find132pattern(int[] nums) {
            if (nums.length < 3) return false;
            int min = nums[0];
            for (int i = 1; i < nums.length; i++) {
                if (nums[i] <= min){
                    min = nums[i];
                }else {
                    for (int j = i+1; j < nums.length; j++) {
                        if (nums[j] < nums[i] && nums[j] > min ){
                            return true;
                        }
                    }
                }
            }
            return false;
        }

       看到个大佬的用栈的解法没太看懂 先记录下来吧。

    class Solution {
    public:
        bool find132pattern(vector<int>& nums) {
            int n=nums.size();
            int third=INT_MIN;
            stack<int> sta;
            for(int i=n-1;i>=0;i--){
                if(nums[i]<third) return true;
                while(!sta.empty() && nums[i]>sta.top()){
                    third=sta.top();
                    sta.pop();
                }
                sta.push(nums[i]);
            }
            return false;
        }
    };

    735 

    public static int[] asteroidCollision(int[] asteroids) {
            LinkedList<Integer> list = new LinkedList<>();
    
            A:for (int i = 0; i < asteroids.length; i++) {
                if (i == 0) {
                    list.push(asteroids[i]);
                    continue ;
                }
                int k = asteroids[i];
                while (!list.isEmpty() && list.peek() > 0 && k < 0  ){
                    if (list.peek() > -k){
                        continue A;
                    } else if (list.peek() == -k){
                        list.pop();
                        continue A;
                    } else {
                        list.pop();
                    }
                }
                list.push(k);
            }
            int[] result = new int[list.size()];
            for (int i = 0; i < result.length; i++) {
                Integer integer = list.removeLast();
                result[i]= integer;
            }
            return result;
        }
  • 相关阅读:
    Kivy / Buildozer VM Ubuntu不能连接到网络的问题解决
    创建PHP组件(composer)
    uniapp基础
    标准js和浏览器js的区别(uniapp)
    swagger api工具 PHP组件 ---- 1
    阿里云视频点播--事件通知
    直接网页打印出现a标签的地址解决办法
    阿里云视频直播--直播转点播--实践2
    阿里云视频直播--直播转点播--实践1
    阿里云视频直播--直播转点播
  • 原文地址:https://www.cnblogs.com/hetutu-5238/p/14329234.html
Copyright © 2011-2022 走看看