龙空技术网

leetcode1862_go_向下取整数对和

每天都AC 29

前言:

今天兄弟们对“c向下取整数”大概比较注意,看官们都想要分析一些“c向下取整数”的相关资讯。那么小编也在网摘上收集了一些关于“c向下取整数””的相关知识,希望咱们能喜欢,看官们一起来学习一下吧!

题目

给你一个整数数组 nums ,请你返回所有下标对 0 <= i, j < nums.length 的 floor(nums[i] / nums[j]) 结果之和。

由于答案可能会很大,请你返回答案对109 + 7 取余 的结果。

函数 floor() 返回输入数字的整数部分。

示例 1:输入:nums = [2,5,9] 输出:10

解释:floor(2 / 5) = floor(2 / 9) = floor(5 / 9) = 0

floor(2 / 2) = floor(5 / 5) = floor(9 / 9) = 1

floor(5 / 2) = 2

floor(9 / 2) = 4

floor(9 / 5) = 1

我们计算每一个数对商向下取整的结果并求和得到 10 。

示例 2:输入:nums = [7,7,7,7,7,7,7] 输出:49

提示:1 <= nums.length <= 105

1 <= nums[i] <= 105

解题思路分析

1、前缀和;时间复杂度O(n^3/2),空间复杂度O(n)

func sumOfFlooredPairs(nums []int) int {   n := len(nums)   count := make([]int, 200001)   for i := 0; i < n; i++ {      count[nums[i]]++   }   arr := make([]int, 200001+1) // 前缀和   for i := 0; i < len(count); i++ {      arr[i+1] = arr[i] + count[i]   }   res := 0   // a/b = c   for i := 0; i < len(count); i++ { // 枚举b      if count[i] > 0 { // i个数大于0         for j := 1; i*j <= 100000; j++ { // 枚举c            // b的个数 X c X 目标范围内的数字个数            total := count[i] * j * (arr[i*(j+1)] - arr[i*j])            res = (res + total) % 1000000007         }      }   }   return res}
总结

Hard题目,借助前缀和,然后枚举被除数,枚举商即可

标签: #c向下取整数 #c语言中向下取整表示