LeetCode智加科技专场——第207场周赛题解

2023-11-26 05:20

本文主要是介绍LeetCode智加科技专场——第207场周赛题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

昨天下午战队赛,第一次在女票面前比赛差点爆零,哎,太丢人了,必须得奋发图强了呀

目录

T1.重新排列单词间的空格

T2.拆分字符串是唯一字符串的数目最大

T3.矩阵的最大非负积

T4.连通两组带你的最小成本


T1.重新排列单词间的空格

不多说了,WA两次才AC,caole

 

class Solution {
public:string reorderSpaces(string text) {int blankNum = 0;int wordNum = 0;vector<string> v;string ans;for (auto elem : text) {if (elem == ' ')blankNum++;}if (blankNum == 0) {return text;}for (int i = 0; i < text.size(); i++) {if (text[i] != ' ') {int j = i;string temp;while (j < text.size() && text[j] != ' ') {temp.push_back(text[j]);j++;}v.push_back(temp);i = j;}}ans += v[0];if (v.size() == 1) {int i = text.size() - ans.size();while (i--) {ans.push_back(' ');}return ans;}int num = blankNum / (v.size() - 1);for (int i = 1; i < v.size(); i++) {for (int j = 0; j < num; j++) {ans.push_back(' ');}ans += v[i];}if (ans.size() < text.size()) {int i = text.size() - ans.size();while (i--) {ans.push_back(' ');}}return ans;}
};

后来看大佬用join写,我只能说,Py牛逼!!

T2.拆分字符串是唯一字符串的数目最大

不可重复回溯模板题,可参见:https://xduwq.blog.csdn.net/article/details/105666096

class Solution {
public:int ans = 0;unordered_set<string> m;int maxUniqueSplit(string s) {dfs(s, 0);return ans;}// dfs不可重复回溯模板void dfs(string& s, int index) {if (index == s.size()) {ans = max(ans, (int)m.size());return;}string temp;for (int i = index; i < s.size(); i++) {temp += s[i];// 先去重if (m.find(temp) == m.end()) {m.insert(temp);dfs(s, i + 1);m.erase(temp);}}}
};

T3.矩阵的最大非负积

这个经典DP启发:

class Solution {
public:int uniquePaths(int m, int n) {int dp[m][n];// for(int i = 0; i<m; i++) {dp[i][0] = 1;}for(int j = 0; j<n; j++) {dp[0][j] = 1;}// for(int i = 1; i<m; i++) {for(int j = 1; j<n; j++) {dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m-1][n-1];}
};

这个类似的矩阵DP题有很多,算是一种模板吧

但是这里有负数的存在,所以处理起来比上面那种模板来讲比较困难。可以维护两个DP数组,一个记录当前的最大值,一个记录当期的最小值(因为最小值可能在下一个步骤当中乘以一个负数就变成了最大值,最大值在下一个步骤当中乘以一个负数就变成最小值了),后面的步骤同理。

typedef long long ll;
class Solution {
public:int maxProductPath(vector<vector<int>>& grid) {// DP模板题ll r = grid.size();ll l = grid[0].size();// 分别保存最大值和最小值,到时候根据正负情况再进行判断ll dp_min[r][l], dp_max[r][l];// 初始化首行和首列dp_min[0][0] = dp_max[0][0] = grid[0][0];for (ll i = 1; i < r; i++)dp_min[i][0] = dp_max[i][0] = dp_min[i-1][0] * grid[i][0];for (ll j = 1; j < l; j++)dp_min[0][j] = dp_max[0][j] = dp_min[0][j-1] * grid[0][j];// 核心DPfor (ll i = 1; i < r; i++) {for (ll j = 1; j < l; j++) {if (grid[i][j] == 0)dp_min[i][j] = dp_max[i][j] = 0;else if(grid[i][j] > 0) {dp_min[i][j] = min(dp_min[i-1][j], dp_min[i][j-1]) * grid[i][j];dp_max[i][j] = max(dp_max[i-1][j], dp_max[i][j-1]) * grid[i][j];} else {dp_min[i][j] = max(dp_max[i-1][j], dp_max[i][j-1]) * grid[i][j];dp_max[i][j] = min(dp_min[i-1][j], dp_min[i][j-1]) * grid[i][j];}}}if (dp_max[r-1][l-1] < 0)return -1;return dp_max[r-1][l-1] % 1000000007;}
};

T4.连通两组带你的最小成本

不说了,我菜炸了,日常放弃,看大佬题解,溜了

class Solution {
public:int size1, size2;int connectTwoGroups(vector<vector<int>>& cost) {size1 = cost.size();size2 = cost[0].size();int total = 1 << (size1 + size2);vector<int> dp(total, 0x3f3f3f3f);return dfs(cost, dp, 0, 0);}int dfs(vector<vector<int>>& cost, vector<int> &dp, int state, int index) {if (index >= size1 + size2) {return 0;}if (dp[state] != 0x3f3f3f3f) {return dp[state];}int result = 0x3f3f3f3f;// 给左边点连线if (index < size1) {for (int i = 0; i < size2; i++) {int nextState = state | (1 << index) | (1 << (size1 + i));result = std::min(result, cost[index][i] + dfs(cost, dp, nextState, index + 1));}// 给右边点连线} else {if ((state & (1 << index)) != 0) {return dp[state] = dfs(cost, dp, state, index + 1);}for (int i = 0; i < size1; i++) {int nextState = (state | (1 << i) | (1 << index));result = std::min(result, cost[i][index - size1] + dfs(cost, dp, nextState, index + 1));}}return dp[state] = result;}
};

 

这篇关于LeetCode智加科技专场——第207场周赛题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/425181

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

从戴尔公司中国大饭店DTF大会,看科技外企如何在中国市场发展

【科技明说 | 科技热点关注】 2024戴尔科技峰会在8月如期举行,虽然因事未能抵达现场参加,我只是观看了网上在线直播,也未能采访到DTF现场重要与会者,但是通过数十年对戴尔的跟踪与观察,我觉得2024戴尔科技峰会给业界传递了6大重要信号。不妨简单聊聊:从戴尔公司中国大饭店DTF大会,看科技外企如何在中国市场发展? 1)退出中国的谣言不攻自破。 之前有不良媒体宣扬戴尔将退出中国的谣言,随着2

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+