力扣2602. 使数组元素全部相等的最少操作次数

力扣2602. 使数组元素全部相等的最少操作次数_第1张图片
力扣2602. 使数组元素全部相等的最少操作次数_第2张图片
这一题数据范围是10^5 暴力不行,但是当我们把暴力的代码写出来的时候就发现

 vector minOperations(vector& nums, vector& queries) {
     vector ans(queries.size());
	 for(int j=0;j
 ans[j]+=abs(nums[i]-queries[j]);

这个式子是不是和我们之前的那个公式似曾相识!?

力扣2615. 等值距离和

我们完全可以像lc 2615这一题一样对式子进行展开
但展开就要去绝对值,那我们就必须找出来,当nums[x],x=多少的时候是第一个大于queries[j]的值,从而确定展开后的式子的形式,但不管怎么说,我们还是可以提前写出来这个式子的大概样子的:

(queries[j]*x-sum[x])+(sum[nums.size()]-sum[x])-querise[j]*nums.size()-x

具体展开方式详看:

力扣1685. 有序数组中差绝对值之和

由展开的式子知我们需要提前算出前缀和
由需要找第一个大于queries[j]的值,也就是找索引x为多少,
找一个数组中第一个大于target的值的位置,很明显是用二分,而二分使用的前提是需要数组有序,因此还需提前排序。
不用二分的话是会超时的。
因此可以得出完整代码

class Solution {
public:
  long long sum[100005];
int erfen(int target,vector& nums)
{
	int l=0;
	int r=nums.size();

	while(l minOperations(vector& nums, vector& queries) {
     vector ans;
	  sort(nums.begin(),nums.end());
	  for(int i=0;i

要注意有相乘的地方记得开long long
vector& nums记得加&不然会超空间
二分要写熟练,我写的还是不熟练。
这一题的关键就在于看出公式
感觉完全就是数学思维。
最终时间复杂度O(nlogn)可以满足10^5的数据范围。

你可能感兴趣的:(算法,leetcode,算法)