828. 统计子串中的唯一字符


按贡献值,也就是每个字符可能在多少个字符串中出现来进行计算,大大降低了复杂度

代码实现(部分看题解)

class Solution {public:int uniqueLetterString(string s) {unordered_map<char, vector<int>> index;int ans = 0;for (int i = 0; i < s.size(); i++) {index[s[i]].push_back(i);}for (auto &&[_, arr] : index) {arr.insert(arr.begin(), -1);arr.emplace_back(s.size());for (int i = 1; i < arr.size() - 1; i++) {ans += (arr[i] - arr[i - 1]) * (arr[i + 1] - arr[i]);}}return ans;}
};

1162. 地图分析

代码实现(自解)

class Solution {public:int maxDistance(vector<vector<int>>& grid) {bool flag1 = false, flag2 = false;queue<pair<int, int>> myQueue;for (int i = 0; i < grid.size(); i++) {for (int j = 0; j < grid[0].size(); j++) {if (grid[i][j]) {flag1 = true;myQueue.push({i, j});}else flag2 = true;}}if (!flag1 || !flag2) return -1;int ans = 1;while (!myQueue.empty()) {auto [i, j] = myQueue.front();// cout << i << " " << j << endl;myQueue.pop();if (i - 1 >= 0 && !grid[i - 1][j]) {grid[i - 1][j] = grid[i][j] == 1 ? - 1 : grid[i][j] - 1;ans = max(ans, -grid[i - 1][j]);myQueue.push({i - 1, j});}if (i + 1 < grid.size() && !grid[i + 1][j]) {grid[i + 1][j] = grid[i][j] == 1 ? - 1 : grid[i][j] - 1;ans = max(ans, -grid[i + 1][j]);myQueue.push({i + 1, j});                }if (j - 1 >= 0 && !grid[i][j - 1]) {grid[i][j - 1] = grid[i][j] == 1 ? - 1 : grid[i][j] - 1;ans = max(ans, -grid[i][j - 1]);myQueue.push({i, j - 1});                }if (j + 1 < grid.size() && !grid[i][j + 1]) {grid[i][j + 1] = grid[i][j] == 1 ? - 1 : grid[i][j] - 1;ans = max(ans, -grid[i][j + 1]);myQueue.push({i, j + 1});                }}return ans;}
};

417. 太平洋大西洋水流问题

代码实现(自解)

class Solution {public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {int m = heights.size();int n = heights[0].size();vector<vector<bool>> pacific(m, vector<bool>(n, false));vector<vector<bool>> atlantic(m, vector<bool>(n, false));queue<pair<int, int>> queue1, queue2;for (int i = 0; i < n; i++) {pacific[0][i] = true;queue1.push({0, i});atlantic[m - 1][i] = true;queue2.push({m - 1, i});}for (int j = 1; j < m; j++) {pacific[j][0] = true;queue1.push({j , 0});atlantic[m - j - 1][n - 1] = true;queue2.push({m - j - 1, n - 1});}while (!queue1.empty()) {auto[i, j] = queue1.front();queue1.pop();if (i - 1 >= 0 && heights[i - 1][j] >= heights[i][j]) {if (!pacific[i - 1][j]) {pacific[i - 1][j] = true;queue1.push({i - 1, j});}}if (i + 1 < m && heights[i + 1][j] >= heights[i][j]) {if (!pacific[i + 1][j]) {pacific[i + 1][j] = true;queue1.push({i + 1, j});}}            if (j - 1 >= 0 && heights[i][j - 1] >= heights[i][j]) {if (!pacific[i][j - 1]) {pacific[i][j - 1] = true;queue1.push({i, j - 1});}}if (j + 1 < n && heights[i][j + 1] >= heights[i][j]) {if (!pacific[i][j + 1]) {pacific[i][j + 1] = true;queue1.push({i, j + 1});}}}while (!queue2.empty()) {auto[i, j] = queue2.front();queue2.pop();if (i - 1 >= 0 && heights[i - 1][j] >= heights[i][j]) {if (!atlantic[i - 1][j]) {atlantic[i - 1][j] = true;queue2.push({i - 1, j});}}if (i + 1 < m && heights[i + 1][j] >= heights[i][j]) {if (!atlantic[i + 1][j]) {atlantic[i + 1][j] = true;queue2.push({i + 1, j});}}            if (j - 1 >= 0 && heights[i][j - 1] >= heights[i][j]) {if (!atlantic[i][j - 1]) {atlantic[i][j - 1] = true;queue2.push({i, j - 1});}}if (j + 1 < n && heights[i][j + 1] >= heights[i][j]) {if (!atlantic[i][j + 1]) {atlantic[i][j + 1] = true;queue2.push({i, j + 1});}}}vector<vector<int>> ans;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (pacific[i][j] && atlantic[i][j])ans.push_back({i, j});}}return ans;}
};

365天挑战LeetCode1000题——Day 081 统计子串中的唯一字符 地图分析 太平洋大西洋水流问题相关推荐

  1. LeetCode 828. 统计子串中的唯一字符(中心扩展)

    1. 题目 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数. 例如:s = "LEETCODE" ,则其中 &qu ...

  2. 828. 统计子串中的唯一字符

    我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数. 例如:s = "LEETCODE" ,则其中 "L&q ...

  3. 365天挑战LeetCode1000题——Day 126 单调栈模板 500题纪念

    用时126天,完成500题,平均4题/天,照这个速率,我还需要四个月完成1000题挑战. 单调栈模板 class Solution {public:vector<int> nextGrea ...

  4. 365天挑战LeetCode1000题——Day 260 800题

    时过但境还没迁,一晃眼过去了4个月,在同样的位置发了博客. 今天完成了第八百道题,然后距离我的365天千题计划,还剩下100天左右,每天再保持两题的刷题量,就能完成我一年前定下的目标了.这也再次证明了 ...

  5. 365天挑战LeetCode1000题——Day 116 第315场周赛 「中国银联 力扣」

    6204. 与对应负数同时存在的最大正整数 代码实现 class Solution {public:int findMaxK(vector<int>& nums) {sort(nu ...

  6. 365天挑战LeetCode1000题——Day 014 每日一题 + 最长公共子序列

    文章目录 1. [我能赢吗](https://leetcode.cn/problems/can-i-win/) 1.1 记忆化搜索+DFS+位运算 2. [最长公共子序列](https://leetc ...

  7. 365天挑战LeetCode1000题——Day 012 每日一题

    文章目录 前言 1. [寻找右区间](https://leetcode.cn/problems/find-right-interval/) 1.1 二分查找 总结 前言 今天还是一题,但是重新学习了快 ...

  8. 365天挑战LeetCode1000题——Day 103 400题 检查二进制字符串字段 最大子序列交替和 最低票价 K 站中转内最便宜的航班

    400题,用时103天,平均3.88题/天,预计154天,也就是5个月后完成目标 1784. 检查二进制字符串字段 代码实现(模拟) class Solution {public:bool check ...

  9. 365天挑战LeetCode1000题——Day 097 神策专场: 判定是否互为字符重排 按身高排序 按位与最大的最长子数组 找到所有好下标 好路径的数目

    面试题 01.02. 判定是否互为字符重排 代码实现(排序) class Solution {public:bool CheckPermutation(string s1, string s2) {s ...

最新文章

  1. java面向对象(类与对象,局部变量成员变量,基本类型和引用类型作为参数传递)...
  2. 如何用九条命令在一分钟内检查 Linux 服务器性能?
  3. python基础教程:名称空间与作用域
  4. linux 为什么编译内核,Linux内核编译与安装
  5. linux 中文文件名不能下载不了,linux 64位系统 mod_encoding解决中文文件名不能下载问题...
  6. PHP基础学习之数组使用要点
  7. oracle 磁盘挂载格式化,Linux简单磁盘挂载
  8. 不止 5G 和鸿蒙,华为最新大招,扔出 AI 计算核弹
  9. java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
  10. 指针与引用的混合使用总结
  11. Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类
  12. 未来三年分布式光伏必然爆发
  13. 哈工大同义词词林 python 使用范例
  14. 游戏应用快速审核上架
  15. 苹果开发☀️ 一、Unity开发苹果应用流程
  16. Redis_Study
  17. “Entity Data Modle Designer 无法显示”的问题
  18. 第十二届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组解析
  19. SG3525频率和占空比参数的选取
  20. LTR问题 position debias方法

热门文章

  1. iframe 加载pdf文件
  2. opencv边缘-边界处理
  3. U9ERP系统无法分割料品领料功能客开开发
  4. Iteratot(迭代器模式) 行为型
  5. 把win7电脑变成无线路由器
  6. 静态HTML网页设计作品—绿色古典旅游景区(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品
  7. 计算机如何计算对数函数
  8. OEA 中 WPF 树型表格整体重构
  9. 居然之家联手分众巨额投入:引爆2亿目标人群 双11力争破百亿
  10. js实现字母序号自动递增