计算数组中每个数左边/右边第一个比其大/小的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算数组中每个数左边/右边第一个比其大/小的值相关的知识,希望对你有一定的参考价值。
参考技术A 如果用最简单的暴力法,时间复杂度最坏情况下 O(n^2)用栈解决,遍历到a[i]
因此栈中元素从底到上按照从大到小的顺序
思路完全一样,只不过遍历的顺序从右到左
思路与 1 相同,只不过栈中元素从底到上按照从小到大的顺序
LeetCode 1395. 统计作战单位数
https://leetcode-cn.com/problems/count-number-of-teams/
这个题目虽然是中等题,但是给的测试用例很少,最大才200个,所以直接暴力三循环也可以过,时间复杂度O(n^3),代码就不贴了。
后来看了花花酱的题解,学到个更加牛逼的技巧?
我们固定一个i,然后寻找左边有多少个比rating[i]小的记作l,右边有多少个比其大的记作r. 然后区间长度减去l或者r就能算出左边有多少个比rating[i]大的,右边有多少个比其小的 相加就是答案
class Solution { public int numTeams(int[] rating) { int ans = 0; for(int j = 0; j < rating.length; j++){ int left = 0; int right = 0; for(int i = 0; i < j; i++){ if(rating[i] < rating[j]){ left++; } } for(int k = j+1; k < rating.length; k++){ if(rating[k] > rating[j]){ right++; } } ans += (left * right) + ((j-left) * (rating.length - j - right - 1)); } return ans; } }
其实这个就是利用到了数学特性,算法还是靠数学呀
以上是关于计算数组中每个数左边/右边第一个比其大/小的值的主要内容,如果未能解决你的问题,请参考以下文章