classSolution { public: boolisprimer(int x){ if (x == 1) { returnfalse; } for (int i = 2; i * i <= x; i++) { if (x % i == 0) { returnfalse; } } returntrue; }
intdiagonalPrime(vector<vector<int>>& nums){ int n = nums.size(); int res = 0; for (int i = 0; i < n; i++) { if (isprimer(nums[i][i])) { res = max(res, nums[i][i]); } if (isprimer(nums[i][n - 1 - i])) { res = max(res, nums[i][n - 1 - i]); } } return res; } };
classSolution { public: intminimizeMax(vector<int>& nums, int p){ sort(nums.begin(), nums.end()); int l = 0; int r = 1e9 + 7; int res = 0; while (l <= r) { int mid = l + (r - l) / 2; int tot = 0; int i = 1; while (i < nums.size()) { if (nums[i] - nums[i - 1] <= mid) { tot++; i += 2; } else { i++; } } if (tot >= p) { res = mid; r = mid - 1; } else { l = mid + 1; } } return res; } };
2617. 网格图中最少访问的格子数
给你一个下标从 0 开始的 m x n 整数矩阵 grid 。你一开始的位置在 左上角 格子 (0, 0) 。
classSolution { public: intminimumVisitedCells(vector<vector<int>>& grid){ int m = grid.size(); int n = grid[0].size(); vector<set<int>> rowCnt(m); vector<set<int>> colCnt(n); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { rowCnt[i].emplace(i * n + j); colCnt[j].emplace(i * n + j); } }
queue<int> qu; qu.emplace(0); int step = 0; while (!qu.empty()) { int sz = qu.size(); for (int i = 0; i < sz; i++) { int curr = qu.front(); qu.pop(); if (curr == m * n - 1) { return step + 1; } int x = curr / n; int y = curr % n; if (grid[x][y] == 0) { rowCnt[x].erase(curr); colCnt[y].erase(curr); continue; } /* 向右移动 */ for (auto it = rowCnt[x].upper_bound(curr); it != rowCnt[x].end() && (*it) - curr <= grid[x][y]; it = rowCnt[x].erase(it)) { qu.emplace(*it); colCnt[y].erase(*it); } /* 向下移动 */ for (auto it = colCnt[y].upper_bound(curr); it != colCnt[y].end() && ((*it) - curr) / n <= grid[x][y]; it = colCnt[y].erase(it)) { qu.emplace(*it); rowCnt[x].erase(*it); } } step++; } return-1; } };