LeetCode 167レースコース週

1290バイナリ整数転送リスト

1291俊回

1292要素と正方形の最大辺の長さの閾値よりも小さいです

最短経路1293グリッド

1290バイナリ整数転送リスト

1290バイナリ整数転送リスト

あなたのノードの単一リンクリストを引用head各リンクリストノード1の値が0ではありません。このリストは、整数のバイナリ表現することが知られています。

代表番号にリストを返却してください小数点値を

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

例1:

**输入:** head = [1,0,1]
**输出:** 5
**解释:** 二进制数 (101) 转化为十进制数 (5)

例2:

**输入:** head = [0]
**输出:** 0

例3:

**输入:** head = [1]
**输出:** 1

例4:

**输入:** head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
**输出:** 18880

例5:

**输入:** head = [0,0]
**输出:** 0

ヒントヒント

ヒント:

  • リストは空ではありません。
  • ノードの総数は、リストを超えません30
  • 各ノードの値がない0こと1

コード

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
 public:
  int getDecimalValue(ListNode* head) {
    int ans(0);
    ListNode *p = head;
    while(p != nullptr) {
      ans = ans * 2 + (p->val);
      p = p->next;
    }
    return ans;
  }
};

1291俊回

1291俊回

すべての上の数字よりも元に大きな数字:私たちは、として、「旬の時間」を定義1する整数。

ご返送ください[low, high]からなる範囲に沿って常に注文(昇順)リスト。

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

例1:

**输出:** low = 100, high = 300
**输出:** [123,234]

例2:

**输出:** low = 1000, high = 13000
**输出:** [1234,2345,3456,4567,5678,6789,12345]

ヒントヒント

ヒント:

  • 10 <= low <= high <= 10^9

コード

class Solution {
 public:
  vector<int> sequentialDigits(int low, int high) {
    vector<int>ans = {12,23,34,45,56,67,78,89,123,234,345,456,567,678,789,1234,2345,3456,4567,5678,6789,12345,23456,34567,45678,56789,123456,234567,345678,456789,1234567,2345678,3456789,12345678,23456789,123456789};
    vector<int>ret;
    int p = lower_bound(ans.begin(),ans.end(),low)-ans.begin();
    int n = ans.size();
    while(p < n && ans[p] <= high) ret.push_back(ans[p++]);
    return ret;
  }
};

1292要素と正方形の最大辺の長さの閾値よりも小さいです

1292要素と正方形の最大辺の長さの閾値よりも小さいです

あなたのサイズを与えるために、m x nマトリックスmatと整数しきい値をthreshold

未満または正方形領域のしきい値の等しい辺の長さの要素の最大和に戻ってください。このような矩形領域と、戻り0

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

例1:

**输入:** mat = [[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[1,1,3,2,4,3,2]], threshold = 4
**输出:** 2
**解释:** 总和小于 4 的正方形的最大边长为 2,如图所示。

例2:

**输入:** mat = [[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2]], threshold = 1
**输出:** 0

例3:

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

例4:

**输入:** mat = [[18,70],[61,1],[25,85],[14,40],[11,96],[97,96],[63,45]], threshold = 40184
**输出:** 2

ヒントヒント

ヒント:

  • 1 <= m, n <= 300
  • m == mat.length
  • n == mat[i].length
  • 0 <= mat[i][j] <= 10000
  • 0 <= threshold <= 10^5

コード

class Solution {
 public:
  int s[300][300];
  int n, m;
  int maxSideLength(vector<vector<int>>& mat, int threshold) {
    this->n = mat.size(), this->m = mat[0].size();
    memset(s, 0, sizeof(s));
    for(int i = 0; i < n; ++i)
      for(int j = 0; j < m; ++j) {
        s[i][j] = mat[i][j];
        if(i)
          s[i][j] += s[i - 1][j];
        if(j)
          s[i][j] += s[i][j - 1];
        if(i && j)
          s[i][j] -= s[i - 1][j - 1];
      }

    int first = 0, middle, half, len = min(n, m);
    const int key = threshold;
    while(len > 0) {
      half = len >> 1;
      middle = first + half;
      //cout << middle << "\n";
      if(cal(middle) > key)
        len = half;
      else {
        first = middle + 1;
        len = len - half - 1;
      }
    }
    //cout << "first " << first << "\n";
    return cal(first)>key ? first - 1 : first;
  }

 private :

  int getSum(int x1, int y1, int x2, int y2) {
    int ans = s[x2][y2];
    if(x1 && y1)
      ans += s[x1 - 1][y1 - 1];
    if(x1)
      ans -= s[x1 - 1][y2];
    if(y1)
      ans -= s[x2][y1 - 1];
    //cout << x1 << " " << y1 << " " << x2 << " " << y2 << ":" << ans << "\n";
    return ans;
  }
  int cal(int x) {
    if(x == 0) return 0;
    int ans = 0x3f3f3f3f;
    for(int i = x - 1; i < n; ++i)
      for(int j = x - 1; j < m; ++j) {
        int t = getSum(i - x + 1, j - x + 1, i, j);
        ans = min(ans, t);
      }
    //cout << "len " << x << ":" << ans << endl;
    return ans;
  }
};

最短経路1293グリッド

最短経路1293グリッド

あなたを与えるm * n各セルはないグリッドを、0(空白)がある1(障害物)。すべてのステップは、あなたが右、下、左の空白セル、上に存在することができます。

あなたがいる場合にまで除去することができk、一つの障害物を上から見つける左(0, 0)の右下隅に(m-1, n-1)
最短パス、およびパスで必要な手順の数を返します。そのようなパスした場合、それは-1を返します。

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

例1:

**输入:**
grid =
[[0,0,0],
 [1,1,0],
 [0,0,0],
 [0,1,1],
 [0,0,0]],
k = 1
**输出:** 6
**解释:** 不消除任何障碍的最短路径是 10。
消除位置 (3,2) 处的障碍后,最短路径是 6 。该路径是 (0,0) -> (0,1) -> (0,2) -> (1,2) -> (2,2) -> **(3,2)** -> (4,2).

例2:

**输入:**
grid =
[[0,1,1],
 [1,1,1],
 [1,0,0]],
k = 1
**输出:** -1
**解释:** 我们至少需要消除两个障碍才能找到这样的路径。

ヒントヒント

ヒント:

  • grid.length == m
  • grid[0].length == n
  • 1 <= m, n <= 40
  • 1 <= k <= m*n
  • grid[i][j] == 0 **or** 1
  • grid[0][0] == grid[m-1][n-1] == 0

コード

class Solution {
 public:
  int shortestPath(vector<vector<int>>& grid, int k) {
    queue<node>que;
    const int inf = 0x3f3f3f3f;
    int ans = inf;
    n = grid.size(), m = grid[0].size();
    que.push(node(0, 0, k, 0));

    while(!que.empty()) {
      node cur = que.front();
      que.pop();
      if(grid[cur.r][cur.c])
        cur.k--;
      vis[cur.r][cur.c][k-cur.k] = true;

      if(cur.r == n - 1 && cur.c == m - 1 && cur.k >= 0) {
        ans = min(ans, cur.s);
      }
      for(int  i = 0, rr, cc; i < 4; ++i) {
        rr = cur.r + dr[i], cc = cur.c + dc[i];
        if(inBound(rr, cc) && !vis[rr][cc][k-cur.k] && k-cur.k <= n*m) {
          que.push(node(rr, cc, cur.k, cur.s + 1));
          vis[rr][cc][k-cur.k] = true;
        }
      }
    }
    return ans == inf ? -1: ans;
  }

 private :
  struct node {
    int r, c, k, s;

    node(int _r,int _c,int _k,int  _s):r(_r),c(_c),k(_k),s(_s){};
  };

  inline bool inBound(int r, int c) {
    return r >= 0 && r < n && c >= 0 && c < m;
  }
  const int dr[4] = {1, -1, 0, 0};
  const int dc[4] = {0, 0, 1, -1};
  int n,m;
  bool vis[41][41][41*41];
};

おすすめ

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