1. 程式人生 > 其它 >1862. 向下取整數對和

1862. 向下取整數對和

先從小到大排序

對每個nums[i],sum += 1,表示自己除自己為1

一、

令p = i + 1,q = 第一個大於等於nums[i]的數的下標,則q - p為與nums[i]相等的數的個數,

sum += (q - p)* 2,因為我們只考慮 5 / 2,而不用考慮2 / 5,但若有兩個5,則必須考慮$5_1 / 5_2,5_2 / 5_1$

所以要*2

二、

之後令q = p,令ans = 1,每次令q = 第一個大於等於nums[i] * (ans + 1)的數的下標,則(q - p)即為有(q - p)個數除nums[i] = ans

sum += (q - p)* ans;

ans++;

直到ans * nums[i] 大於 最大值,則i++,繼續下一個nums

每次記錄一中的值和二中的值,如果第i + 1個數與第i個相同,則可以重複使用

class Solution {
public:
    int vis[100010];
    bool vis1[100010];
    set<int> ss;
    int mod = 1e9 + 7;
    int sumOfFlooredPairs(vector<int>& nums) {
        memset(vis, 0, sizeof(vis));
        memset(vis1, 
0, sizeof(vis1)); // vector<int> NUM; int n = nums.size(); int max_v = -1; for(int i = 0; i < n; i++) { vis[nums[i]]++; max_v = max(max_v, nums[i]); // ss.insert(nums[i]); } sort(nums.begin(), nums.end());
int sum = 0, cnt = 0, pre_same, pre_nosame; for(int i = 0; i < n; i++) { sum = (sum + 1) % mod; if(i > 0 && nums[i] == nums[i - 1]) { pre_same--; sum = (sum + pre_same * 2 % mod) % mod; sum = (sum + pre_nosame) % mod; continue; } pre_nosame = 0; int ans = 1, p = i + 1, q; q = upper_bound(nums.begin(), nums.end(), nums[i]) - nums.begin(); sum = (sum + (q - p) * 2 % mod) % mod; pre_same = q - p; p = q; while(i < n - 1 && (nums[i]) * ans <= max_v) { q = lower_bound(nums.begin(), nums.end(), nums[i] * (ans + 1)) - nums.begin(); sum = (sum + (((q - p) * ans) % mod) ) % mod; pre_nosame = (pre_nosame + (q - p) * ans % mod) % mod; ans++; p = q; } } return sum; } };
自己選擇的路,跪著也要走完。朋友們,雖然這個世界日益浮躁起來,只要能夠為了當時純粹的夢想和感動堅持努力下去,不管其它人怎麼樣,我們也能夠保持自己的本色走下去。