leetcode 629. K Inverse Pairs Array

来源:互联网 发布:c语言闰年流程图 编辑:程序博客网 时间:2024/06/05 06:41

629. K Inverse Pairs Array

  • User Accepted: 81
  • User Tried: 363
  • Total Accepted: 83
  • Total Submissions: 1074
  • Difficulty: Medium

Given two integers n and k, find how many different arrays consist of numbers from1 to n such that there are exactly k inverse pairs.

We define an inverse pair as following:For ith and jth element in the array, if i < j anda[i] > a[j] then it's an inverse pair; Otherwise, it's not.

Since the answer may very large, the answer should be modulo 109 + 7.

Example 1:

Input: n = 3, k = 0Output: 1Explanation: Only the array [1,2,3] which consists of numbers from 1 to 3 has exactly 0 inverse pair.

Example 2:

Input: n = 3, k = 1Output: 2Explanation: The array [1,3,2] and [2,1,3] have exactly 1 inverse pair.

Note:

  1. The integer n is in the range [1, 1000] and k is in the range [0, 1000].



思路不难想,dp[i][j]表示前i个数字构成j个逆序对的方法数。最朴素的想法是三重循环做,但是可以优化掉最内层对i-1的那层循环。


问题是对边界的处理真的烦,之前的codeM也是,很多题的思路都是对的,但就是边界的问题或者是写法不好导致题目过不去,总是差那么一点。。。真的伤心。。。

public class Solution {      public int kInversePairs(int n, int k) {          long[][] dp = new long[n+1][k+1];                    for(int i=0; i<=n; i++)              dp[i][0] = 1;                    for(int i=1; i<=n; i++)              for(int j=1; j<=k; j++) {                  dp[i][j] = dp[i][j-1]+dp[i-1][j];                  if(j-i >= 0) dp[i][j] -= dp[i-1][j-i];                  dp[i][j] += 1000000007;                  dp[i][j] %= 1000000007;              }                    return (int) dp[n][k];      }  }  


原创粉丝点击