首页 > 其他分享 >day13:leetcode:150,239,347

day13:leetcode:150,239,347

时间:2022-10-03 21:02:30浏览次数:36  
标签:150 int pop duque 347 239 push value stack1

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;
    }

}

标签:150,int,pop,duque,347,239,push,value,stack1
From: https://www.cnblogs.com/wdnmdp/p/16751221.html

相关文章

  • 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频
    第一题150.逆波兰表达式求值根据逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。注意 两个整数之......
  • [loj2398]自然公园
    维护一个连通块$S$,初始$S=\{0\}$,考虑拓展$x\not\inS$若$x$与$S$中某点相邻,则需找出$S$中所有与$x$相邻的点,并将$x$加入$S$若$x$不与$S$中某点相邻,则需找出$x$到$0$的某......
  • 洛谷 P1506 拯救oibh总部(DFS / 染色法)
    https://www.luogu.com.cn/problem/P1506题目描述给定n*m的图形,由*和0组成。让我们求出被*四面包围了的0的数量。输入#1450000000*000*0*000*00输出......
  • Linux 操作必备 150 个命令,速度收藏~
    链接:https://www.cnblogs.com/bananaaa/p/7774467.htmllinux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还......
  • 链接服务器读取Mysql---出现消息 7347,级别 16,状态 1,第 13 行 链接服务器 '****' 的 OL
    可以毫不夸张的说:“网上所有搜索出来的答案,都没有解决我的问题”,我是采用以下的方式处理此异常,借此宝地mark一下  今天使用链接服务器查询Mysql数据库时,出现以下问题......
  • LeetCode[2399. 检查相同字母间的距离]
    2399.检查相同字母间的距离classSolution{public:boolcheckDistances(strings,vector<int>&distance){vector<int>p[26];//首先我们定义一个......
  • ABC 239 E - Subtree K-th Max(树+dfs)
    https://atcoder.jp/contests/abc239/tasks/abc239_e题目大意:给定一棵树,根节点是1,一共有n个节点,每一个节点都有它自己的值给定n-1条边,和q个询问问我们在第x个节点之......
  • LeetCode[150] 逆波兰表达式求值
    1逆波兰表达式求值1.1题目描述        根据逆波兰表示法,求表达式的值。有效的算符包括+、-、*、/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 ......
  • LeetCode 239. 滑动窗口最大值
    终于做了一道Hard...依旧是感觉差一点做出来,哎参考随想录思路题目给你一个整数数组nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到......
  • P1347 排序 题解
    题干交了8次,下载了3个测点.....首先这个题,很容易想到用拓扑如果有“X$<$Y”,就建立一条从X到Y的有向边要考虑到,如果排序成立,必须满足入度为0的点只有一个并且出度为0的......