退役老人现在连leetcode都不会做了 = =

今天早上做了leetcode第三题题目看错了,加上比赛中间还在调投稿的实验,一心二用直接gg

总结下教训就是 本渣现在做题连题目都看不清就开始做。开始写题之前应当把样例过一遍,然后自己再造1-2个例子,然后再开始做

A题:统计素数的个数(素数筛或者sqrt(n)判断都可以),然后分别计算count!

class Solution {
public:
int numPrimeArrangements(int n) {
vector<int> has(n + 5, 0);
int cntPrime = 0;
const int MOD = 1e9 + 7;
for(int i = 2; i <= n; ++i) {
if(has[i] == 0) cntPrime ++;
for(int j = i * 2; j <= n; j += i) {
has[j] = 1;
}
}
int result = 1;
for(int i = 1; i <= n - cntPrime; ++i) {
result = 1ll * i * result % MOD;
}
for(int i = 1; i <= cntPrime; ++i) {
result = 1ll * i * result % MOD;
}
return result;
}
};

B题:滚动求和

class Solution {
public:
int dietPlanPerformance(vector<int>& calories, int k, int lower, int upper) {
long long sum = 0;
for(int i = 0; i < k; ++i) {
sum += calories[i];
}
int result = 0;
for(int i = k - 1, len = calories.size(); i < len; ++i) {
if(sum < lower) result --;
else if(sum > upper) result ++;
if(i != len - 1) {
sum -= calories[i - k + 1];
sum += calories[i + 1];
}
}
return result;
}
};

C题:我之前把题意看成整个字符串满足是回文,这个复杂很多。。。。

正确解法是判断区间的每种字母个数,我们知道偶数是可以直接配对的(放对称位置就好了),统计字母个数为奇数的,奇数的需要改一半就好了

class Solution {
private:
vector<int> has[26];
int get(int id, int fr, int to) {
if(fr > to) return 0;
if(fr == 0) return has[id][to];
else return has[id][to] - has[id][fr - 1];
}
public:
vector<bool> canMakePaliQueries(string s, vector<vector<int>>& queries) { int slen = s.length();
for(int i = 0; i < 26; ++i) has[i].clear(); /***statistic character count*****/
for(int i = 0; i < 26; ++i) {
for(int j = 0; j < slen; ++j) {
has[i].push_back(0);
}
}
for(int i = 0; i < slen; ++i) {
has[s[i] - 'a'][i] ++;
}
for(int i = 0; i < 26; ++i) {
for(int j = 1; j < slen; ++j) {
has[i][j] += has[i][j-1];
}
} vector<bool> result;
for(int i = 0, len = queries.size(); i < len; ++i) {
int left = queries[i][0]; int right = queries[i][1]; int k = queries[i][2]; int cnt = 0;
for(int j = 0; j < 26; ++j) {
int t1 = get(j, left, right);
if(t1 % 2 == 1) {
cnt ++;
}
}
cnt /= 2;
if(cnt <= k) result.push_back(true);
else result.push_back(false);
} return result;
}
};

D题:基本思想就是暴力查询,首先我们知道,字符串中的字母排列前后和出现次数都是无所谓的(除了puzzle的第一个字母的问题),这个是可以进行处理的

除此之外有两种加速的方法

方法1: 位压缩为26位,直接通过数位判断word是否是满足puzzle

方法2: 对word建立字典树,让puzzle在字典树中进行dfs,这里每个puzzle大约会有7!的查询复杂度

下面两个代码分别对应这两种方案,我是直接discuss的大佬里面爬下来了

class Solution {
vector<int> base;
void born(vector<string>& words){
for(auto& s: words){
set<char> tmp;
int bit = 0;
for(auto c:s){
tmp.insert(c);
bit = bit | (1<<(c-'a'));
}
if(tmp.size() >7)continue;
base.push_back(bit);
}
}
public:
vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {
vector<int> ans;
born(words); for(auto& s: puzzles){
int num = 0;
int bit = 0;
for(auto c: s){
bit = bit | (1<<(c-'a'));
}
int firstBit = 1 << (s[0] - 'a');
for(auto v: base){
if((v & bit) == v && ((firstBit & v) == firstBit)){
num++;
}
}
ans.push_back(num);
} return ans;
}
};
const int ALPHABET_SIZE = 26;

/* The structure of a trie node */
struct TrieNode
{
struct TrieNode* children[ALPHABET_SIZE];
int count = 0;
}; /* Creates a new trie node and returns the pointer */
struct TrieNode* getNode()
{
struct TrieNode* newNode = new TrieNode; for(int i=0; i<ALPHABET_SIZE; i++)
newNode->children[i] = nullptr; newNode->count = 0; return newNode;
} /* Inserts the given string to the collection */
void insert(struct TrieNode* root, string str)
{
struct TrieNode* pCrawl = root; for(int i=0; i<str.length(); i++)
{
int index = str[i]-'a'; if(!pCrawl->children[index])
pCrawl->children[index] = getNode(); pCrawl = pCrawl->children[index];
} pCrawl->count = (pCrawl->count + 1);
} /* Returns the count of strings which are valid */
int search(struct TrieNode* root, string str, bool firstSeen, char firstLetter)
{
if(!root)
return 0; int count = 0; if(firstSeen)
count += root->count; for(int i=0; i<str.length(); i++)
{
int index = str[i] - 'a'; if(str[i] == firstLetter)
count += search(root->children[index], str, true, firstLetter);
else
count += search(root->children[index], str, firstSeen, firstLetter);
} return count;
} class Solution
{
public:
vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles);
}; vector<int> Solution :: findNumOfValidWords(vector<string>& words, vector<string>& puzzles)
{
struct TrieNode* root = getNode(); for(auto str : words)
{
set<char> temp;
temp.insert(str.begin(), str.end()); string sorted = "";
for(auto ele : temp)
sorted += ele; insert(root, sorted);
} vector<int> count;
for(auto puzzle : puzzles)
{
char firstLetter = puzzle[0];
sort(puzzle.begin(), puzzle.end());
count.push_back(search(root, puzzle, false, firstLetter));
} return count; }

Leetcode Weekly Contest 152的更多相关文章

  1. LeetCode Weekly Contest 8

    LeetCode Weekly Contest 8 415. Add Strings User Accepted: 765 User Tried: 822 Total Accepted: 789 To ...

  2. leetcode weekly contest 43

    leetcode weekly contest 43 leetcode649. Dota2 Senate leetcode649.Dota2 Senate 思路: 模拟规则round by round ...

  3. LeetCode Weekly Contest 23

    LeetCode Weekly Contest 23 1. Reverse String II Given a string and an integer k, you need to reverse ...

  4. Leetcode Weekly Contest 86

    Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...

  5. LeetCode Weekly Contest

    链接:https://leetcode.com/contest/leetcode-weekly-contest-33/ A.Longest Harmonious Subsequence 思路:hash ...

  6. 【LeetCode Weekly Contest 26 Q4】Split Array with Equal Sum

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/split-array-with-equal-sum/ ...

  7. 【LeetCode Weekly Contest 26 Q3】Friend Circles

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/friend-circles/ [题意] 告诉你任意两个 ...

  8. 【LeetCode Weekly Contest 26 Q2】Longest Uncommon Subsequence II

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...

  9. 【LeetCode Weekly Contest 26 Q1】Longest Uncommon Subsequence I

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...

随机推荐

  1. dedecms新建内容模型“把数据保存到数据库附加表时出错‘xxx’出错”错误的原因分析和解决方案(转)

    把数据保存到数据库附加表 `bc_addonarticle17` 时出错,请把相关信息提交给DedeCms官方.INSERT INTO `bc_addonarticle17`(aid,typeid,r ...

  2. python中的*args和** kwargs区别

    写了几个月的oython了总感觉除了if else for while什么都不太会,看了架构师的代码参数传递总是使用*args,**kwargs,一直搞不太明白,只是模仿着用,最近有时间想系统的学习一 ...

  3. 关于sprintf的使用注意

    今天在使用sprintf时,本想简单一点,将第一个参数直接定义为一个字符型的指针(cher  *str;),结果没想到程序变得死死的,老老实实的将第一个参数重新变回字符型数组吧(char str[10 ...

  4. js - 原生ajax访问后台读取数据并显示在页面上

    1.前台调用ajax访问后台方法,并接收数据 <%@ page contentType="text/html;charset=UTF-8" language="ja ...

  5. arm汇编指令--str ldr

    STR :把寄存器中的字保存到存储器(寄存器到存储器) 示例: STR R0,[R1],#8             :将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1.STR ...

  6. C语言数据类型及变量整理

    数据类型 获取int的字节数大小方法 printf("int bytes:%d",sizeof(int)); 列表整理 类型 字节数 取值范围 char 1 [-128,127]= ...

  7. JS面向对象编程(二):构造函数的继承

    对象之间继承的 5 中方法.            比如, 现在有一个"动物"对象的构造函数.            function Animal(){              ...

  8. vuex的实现

    源代码可以查看我的github:  https://github.com/Jasonwang911/TryHardEveryDay/tree/master/Vuex/vuex-resouce  欢迎s ...

  9. react项目建立导入包问题总结

    1.react和react-dom包 使用react开发网页的话,我们难免会下载两个包,一个是react,一个是react-dom,其中react是react的核心代码.react的核心思想是虚拟Do ...

  10. Git/Github使用方法小记

    今天把人间网的桌面客户端renjian-deck正式开源了,之前对javascript的了解其实非常的不够的,所以这一次的代码写的也是乱七八糟重用性及其低下,虽然我无数次的想把代码重新整理一下,不过还 ...