LeetCode- 166レースコース週

LeetCode- 166レースコース週

1281.subtract-製品アンド和の桁-整数の

1282.group-人から与えられた-グループサイズ-彼ら-属し-へ

1283.find-最小-除数-閾値与え

1284.minimumナンバー・オブ・フリップ・ツー・変換バイナリ・マトリックス・ツー・ゼロ行列

あなたと製品の間に1281の整数差

1281.subtract-製品アンド和の桁-整数の

タイトル説明説明

あなたの整数nは、してくださいヘルプ計算を与え、整数差「あなたは数字の製品」と「数字と」戻ります。

サンプル入力と出力のサンプルサンプル入力と出力例

例1:

输入:n = 234
输出:15 
解释:
各位数之积 = 2 * 3 * 4 = 24 
各位数之和 = 2 + 3 + 4 = 9 
结果 = 24 - 9 = 15

例2:

输入:n = 4421
输出:21
解释: 
各位数之积 = 4 * 4 * 2 * 1 = 32 
各位数之和 = 4 + 4 + 2 + 1 = 11 
结果 = 32 - 11 = 21

ヒントヒント

1 <= N <= 10 ^ 5

コード

class Solution {
 public:
  int p(int n) {
    int ans(1);
    while(n)
      ans *= n % 10, n /= 10;
    return ans;
  }
  int s(int n) {
    int ans(0);
    while(n)
      ans += n % 10, n /= 10;
    return ans;
  }

  int subtractProductAndSum(int n) {
    return p(n) - s(n);
  }
};

1282ユーザグループ

1282.group-人から与えられた-グループサイズ-彼ら-属し-へ

タイトル説明説明

ありnは、ユーザーが活動に参加するために、0からnまでの自分のID - 1は、各ユーザーは、ユーザーの特定のグループに属していることを起こります。ユーザーグループ(ユーザグループ、ならびに各グループID内のユーザの存在)に戻り、あなたの各ユーザのユーザ・グループのサイズが含まれている長さN groupSizesの配列を与えます。

あなたはすべてのソリューションのリターンを注文することができ、注文IDが限定されるものではありません。さらに、対象データ解析は、少なくとも一つの解決策が存在することを確実にします。

サンプル入力と出力のサンプルサンプル入力と出力例

例1:

输入:groupSizes = [3,3,3,3,3,1,3]
输出:[[5],[0,1,2],[3,4,6]]
解释: 
其他可能的解决方案有 [[2,1,6],[5],[0,4,3]] 和 [[5],[0,6,2],[4,3,1]]。

例2:

输入:groupSizes = [2,1,3,3,3,2]
输出:[[1],[0,5],[2,3,4]]

ヒントヒント

    groupSizes.length == n
    1 <= n <= 500
    1 <= groupSizes[i] <= n

コード

using std::vector;
class Solution {
 public:
  vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
    int n = groupSizes.size();
    vector<vector<int>> ans;
    vector<int> g[n + 1];
    for(int i = 0; i < n; ++i) {
      g[groupSizes[i]].push_back(i);
      if(g[groupSizes[i]].size() == groupSizes[i]) {
        ans.push_back(g[groupSizes[i]]);
        g[groupSizes[i]].clear();
      }
    }
    return ans;
  }
};

1283の結果がしきい値を超えないように最低限の除数

1283.find-最小-除数-閾値与え

タイトル説明説明

NUMSはあなたの整数の配列を与え、正の整数閾値は、あなたは正の整数除数、各数値は、それによって分割されたアレイ、及び分割和の結果を選択する必要があります。

あなたは結果が閾値閾値未満が最も小さい1の約数に等しくなるように見つけることができます。

除数によって分割された各番号は、= 5 10/2を7/3 = 3、切り上げ言われます。

トピックは解決できる保証しました。

サンプル入力と出力のサンプルサンプル入力と出力例

例1:

输入:nums = [1,2,5,9], threshold = 6
输出:5
解释:如果除数为 1 ,我们可以得到和为 17 (1+2+5+9)。
如果除数为 4 ,我们可以得到和为 7 (1+1+2+3) 。如果除数为 5 ,和为 5 (1+1+1+2)。

例2:

输入:nums = [2,3,5,7,11], threshold = 11
输出:3

例3:

输入:nums = [19], threshold = 5
输出:4

ヒントヒント

1 <= nums.length <= 5 * 10 ^ 4
1 <= NUMS [I] <= 10 ^ 6
nums.length <=閾値<= 10 ^ 6

コード

class Solution {
 public:
  int cal(vector<int>&nums, int x) {
    int ans(0);
    for(auto i : nums) {
      ans += (i+x-1) / x;
    }
    return ans;
  }
  int smallestDivisor(vector<int>& nums, int threshold) {
    int first = 1, middle, half, len = *max_element(nums.begin(), nums.end());
    while(len > 0) {
      half = len >> 1;
      middle = first + half;
      if(cal(nums, middle) > threshold) {
        first = middle + 1;
        len = len - half - 1;
      } else
        len = half;
    }
    return first;
  }

};

反転の最小数とゼロの行列に1284

1284.minimumナンバー・オブ・フリップ・ツー・変換バイナリ・マトリックス・ツー・ゼロ行列

タイトル説明説明

あなたMXNバイナリ行列マットを与えます。

各ステップは、あなたが(反転は0、1から1 0に示す。)細胞およびその反転を選択することができます。それと隣接するセルが存在する場合は、これらの隣接するセルが逆になります。(注:同じ側を共有する二つの隣接するセル)。

すべてゼロの行列にない場合は、逆の最小数とゼロの行列に行列マットに戻ってください、戻ってください-1。

各グリッドバイナリ行列は、0または1です。

すべてのゼロ行列は、グリッドがゼロであるすべての行列です。

サンプル入力と出力のサンプルサンプル入力と出力例

例1:

输入:mat = [[0,0],[0,1]]
输出:3
解释:一个可能的解是反转 (1, 0),然后 (0, 1) ,最后是 (1, 1) 。

例2:

输入:mat = [[0]]
输出:0
解释:给出的矩阵是全零矩阵,所以你不需要改变它。

例3:

输入:mat = [[1,1,1],[1,0,1],[0,0,0]]
输出:6

例4:

输入:mat = [[1,0,0],[1,0,0]]
输出:-1
解释:该矩阵无法转变成全零矩阵

ヒントヒント

M == mat.length
N ==マット[0] .LENGTH
1 <= M <= 3
1 <= N <= 3
マット[I] [J]是0或1。

コード

#include <bits/stdc++.h>

using std::vector;
using std::min;
class Solution {
 public:
  int digitCount(int x) {
    int ans(0);
    while(x) {
      if(x & 1)
        ans ++;
      x >>= 1;
    }
    return ans;
  }

  inline void flip(int &x) {
    if(x)
      x = 0;
    else
      x = 1;
  }

  int chk(vector<vector<int>>mat, int x) {
    int n = mat.size();
    int m = mat[0].size();
    for(int i = 0; i < n; ++i)
      for(int j = 0; j < m; ++j) {
        if(x & (1 << i * m + j)) {
          flip(mat[i][j]);
          if(i)
            flip(mat[i - 1][j]);
          if(i < n - 1)
            flip(mat[i + 1][j]);
          if(j)
            flip(mat[i][j - 1]);
          if(j < m - 1)
            flip(mat[i][j + 1]);
        }
      }
    for(int i = 0; i < n; ++i)
      for(int j = 0; j < m; ++j)
        if(mat[i][j])
          return false;
    return true;
  }

  int minFlips(vector<vector<int>>& mat) {
    int n = mat.size(), m = mat[0].size();
    const int inf = 0x3f3f3f3f;
    int ans(inf);
    for(int i = 0; i < (1 << n * m); ++i)
      if(chk(mat, i))
        ans = min(ans, digitCount(i));
    return ans == inf ? -1 : ans;
  }

};

おすすめ

転載: www.cnblogs.com/Forgenvueory/p/12015944.html