day13:leetcode:150,239,347

leetcode150. 逆波兰表达式求值

image
本题的思路和之前的括号配对,两数相消的思想一样,利用栈先进后出的特性,三个字符相消

到遍历到的是数字时,直接push,当遇到运算符,直接pop出两个数字做运算,然后push进栈,最后栈剩下的一个数就是最终表达式的值。

class Solution {
    public int evalRPN(String[] tokens) {
        Deque<Integer> stack1 = new LinkedList();
        for(String t:tokens){
            if(t.equals("+")){                 //string类型要用equals
                stack1.push(stack1.pop()+stack1.pop());    
            }else if(t.equals("-")){
                stack1.push(-stack1.pop()+stack1.pop()); 
				// 先弹出的是减数 后弹出的是被减数
            }else if(t.equals("/")){
                int temp1 = stack1.pop();
                int temp2 = stack1.pop();
                int x=temp2/temp1;
                stack1.push(x);
            }else if(t.equals("*")){
                stack1.push(stack1.pop()*stack1.pop());
            }else{
                stack1.push(Integer.valueOf(t));   
            }
            
        }
        return stack1.pop();
    }
}

leetcode239滑动窗口的最大值

定义单调递减的队列数据结构

class MyQueue{
	Deque<Integer> duque=new LinkList<>();
	void poll(int val){
	 	if(!duque.isEmpty()&&val==duque.peek()){
			duque.poll();
		}
	}
	void push(int val){
		while(!duque.isEmpty()&&val>duque.getLast()){  //如果前端比val小  那直接那前端全删掉,然后再加入元素
			duque.removeLast();
		}
		duque.add(val);
	}
	int peek(){
		return duque.peek();
	}
}

LeetCode:347
思路:利用hashmap key记录元素值,value 记录元素出现的次数,然后对value的值进行一个排序,但是本题只要前k个,不需要全部排序之后的结果,利用大顶堆或者小顶堆始终维持k个元素,利用大顶堆,每次弹出的会是最大值,小顶堆每次弹出的是最小值,到最后留下的元素表示 最大的k个值。

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map=new HashMap<>(); //key存元素 value存次数
        for(int num:nums){     //遍历数组  次数++
            map.put(num,map.getOrDefault(num,0)+1);
        }
        PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);             //定义优先级队列,小顶堆
         for(Map.Entry<Integer,Integer> entry:map.entrySet()){
             if(pq.size()<k){    //将key value 当成一个数组存入小顶堆中小顶堆大小为k,且value最大的在最后面
                 pq.add(new int[]{entry.getKey(),entry.getValue()});
             }else{
                 if(entry.getValue()>pq.peek()[1]){    
				 //如果大于左边value最小的,则替换掉(因为是小顶堆,所以value最小的应该在最左边,所以每次只要比较value是否比最小的大就行)
                     pq.poll();
                     pq.add(new int[]{entry.getKey(),entry.getValue()});
                 }
             }
         }
        int[] ans =new int[k];
        for(int i=k-1;i>=0;i--){       //倒序遍历进数组
            ans[i]=pq.poll()[0];
        }
        return ans;
    }

}

posted on 2022-10-03 20:47  你是千堆雪我是长街7  阅读(14)  评论(0)    收藏  举报

导航