1583. 统计不开心的朋友 #模拟 #暴力

题目链接

题意

n为朋友,对每位朋友ipreference[i]包含 按亲密度从大到小 的朋友编号。

朋友们会被分为若干对,配对情况由pairs数组给出,即pair[i]={xi, yi}表示xiyi相互配对。

xy相互配对且uv相互配对的情况下,如果同时满足下面两个条件,x就会不高兴

  • x->u亲密度 大于 x->y
  • u->x亲密度 大于 u->v

分析

初看题目,我以为一旦满足上述两条件,不但x不高兴,u也会不高兴。然而,这是错的。

对于数据6, preferences=[[1,4,3,2,5],[0,5,4,3,2],[3,0,1,5,4],[2,1,4,0,5],[2,1,0,3,5],[3,4,2,0,1]], pairs = [[3,1],[2,0],[5,4]],只有5号是高兴的,这是因为5号对4号亲密度太高(rank=4),5号只能去找1(rank=5),然而1号对3号的亲密度更高(rank=5),被3号锁住,因而5是高兴的。

由此,我们不应该遍历pairs,而是将pairs中的配对情况记录到每个人身上,再遍历每个人,检查是否不开心。

下面代码中rank[i][j]代表i号对j号的亲密度。而mypair[i]代表ipair中配对的另一个人编号。

class Solution {
private:
int rank[505][505], mypair[505];
public:
bool Judge(int cur, int n){ //判断是否不开心
int p = mypair[cur];
for (int i = 0; i < n; i++){
if(rank[cur][p] < rank[cur][i]
&& rank[i][mypair[i]] < rank[i][cur]) //按照题目要求
return true;
}
return false;
}
int unhappyFriends(int n, vector<vector<int>>& preferences, vector<vector<int>>& pairs) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n - 1; j++)
rank[i][preferences[i][j]] = n - j; //存下i的朋友亲密度
for (int i = 0; i < n / 2; i ++){ //将每对pair中两人对应队友记录下来
mypair[pairs[i][0]] = pairs[i][1];
mypair[pairs[i][1]] = pairs[i][0];
}
int ans = 0;
for(int i = 0; i < n; i++)
if(Judge(i, n)) ans++;
return ans;
}
};

1585. 检查字符串是否可以通过排序子字符串得到另一个字符串 #暴力 #排序思想 #模拟

题目链接

题意

给定字符串st,可通过若干次的下述操作将s转化为t——选择s中一个非空子字符串并将它包含的字符就地升序排序。现要你判断s通过这些操作能否得到t。其中子字符串定义为一个字符串中连续的若干字符。

分析

更详细的证明过程参考零神的题解

模拟st的过程,对t串一个个字符进行考虑。首先考虑t[0]t串的首字符)在s串中首位置,记为s[t_0](=t[0])。我们怎么知道字符s[t_0]能否通过排序使其放到s首位呢?只有当s[t_0]都小于s[0],s[1],...,s[t_0 - 1]这些元素,即比s[t_0]小的元素 都在s[t_0]的右侧,这时候s[t_0]有机会通过排序将原来位置降到s的首位置。当我们比较完,确定满足该条件时,s[t_0]以后不再考虑,转而考虑下一字符t[1],找到在s中对应的 最前位置s[t_i],判断s[t_i]能否移动到s中的第1个位置…..

如何实现?我们为10个数字的每个数字都准备一个队列,用来存储该数字在s串中的位置。为什么要用队列?因为我们在检查cur前面的数字是否在cur左侧时,只需要用查询数字0,1,...,cur-1的当前一个位置即可,若检查不出,说明可以将cur搬到前面,接下来直接将该cur的最新下标排除即可,模拟排序子过程。

class Solution {
public:
bool isTransformable(string s, string t) {
vector< queue<int> > pos(10);
for (int i = 0; i < s.length(); i++)
pos[s[i] - '0'].push(i); //存下每一种数字在s串中的位置
for (int i = 0; i < t.length(); i++){ //遍历t串中每一个字符
int cur = t[i] - '0';
if(pos[cur].empty()) //说明s串字符数量与t串不相等,显然无法满足题意
return false;
for (int j = 0; j <= cur; j++){ //检查s串中 比t[i]小 的字符 所在的下标
if(!pos[j].empty() && pos[j].front() < pos[cur].front())
return false;
//如果t串中t[i]的左边,存在一个比t[i]还小的字符,显然不能将t[i]冒泡到前面
}
pos[cur].pop(); //即时更新数字cur的下标
}
return true;
}
};

LeetCode周赛#206的更多相关文章

  1. 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)

    Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...

  2. 【一天一道LeetCode】#206. Reverse Linked List

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Reverse ...

  3. 拼写单词[哈希表]----leetcode周赛150_1001

    题目描述: 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我 ...

  4. 【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)

    Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653—656) 链接:htt ...

  5. 【Leetcode周赛】从contest-51开始。(一般是10个contest写一篇文章)

    Contest 51 (2018年11月22日,周四早上)(题号681-684) 链接:https://leetcode.com/contest/leetcode-weekly-contest-51 ...

  6. 【Leetcode周赛】从contest-71开始。(一般是10个contest写一篇文章)

    Contest 71 () Contest 72 () Contest 73 (2019年1月30日模拟) 链接:https://leetcode.com/contest/weekly-contest ...

  7. 【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)

    Contest 81 (2018年11月8日,周四,凌晨) 链接:https://leetcode.com/contest/weekly-contest-81 比赛情况记录:结果:3/4, ranki ...

  8. 【Leetcode周赛】从contest-91开始。(一般是10个contest写一篇文章)

    Contest 91 (2018年10月24日,周三) 链接:https://leetcode.com/contest/weekly-contest-91/ 模拟比赛情况记录:第一题柠檬摊的那题6分钟 ...

  9. 【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)

    Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日 ...

随机推荐

  1. 操作安装docker

    在本地建造起vue-cli服务 参考项目:https : //gitee.com/QiHanXiBei/myvue 在本地建造起一个django项目架构,通过/ hello能够打印出helloworl ...

  2. SQL Server 列存储索引 第二篇:设计

    列存储索引可以是聚集的,也可以是非聚集的,用户可以在表上创建聚集的列存储索引(Clustered Columnstore Index)或非聚集的列存储索引(Nonclustered Columnsto ...

  3. linux添加自动清空缓存

    1. cleanCache.sh vim cleanCache.sh #!/bin/bash #每两小时清除一次缓存 echo "开始清除缓存" sync;sync;sync #写 ...

  4. 解决Affter Effect汉化版(cc2015之后的版本)中出现表达式错误的一种常用方法

    解决Affter Effect出现表达式错误的一种常用方法 问题:汉化版的AE中,使用模板会出现表达式错误之类的提示,可能会导致某些设置或者效果失效 解决办法: 方法一.将配置文件中的zh_CN 改为 ...

  5. JavaSE基础语法学习

    标识符 表示类名的标识符用大写字母开始. 表示方法和变量的标识符用小写字母开始,后面的描述性词以大写开始. 注意 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($).或者下划线(_)开始 ...

  6. Python的Cmd模块的简易运用学习

    昨天大佬阿炳给发了一份代码给我,看着感觉很好玩,这是自己写了个命令行吗,完了我就找篇更详细一点的博客学习了一下  cmd的主要方法和属性 方法: (1)cmdloop():类似与Tkinter的mai ...

  7. Android序列化问题与思考

    今天再来谈谈Android中的对象序列化,你了解多少呢? 序列化指的是什么?有什么用 序列化指的是讲对象变成有序的字节流,变成字节流之后才能进行传输存储等一系列操作. 反序列化就是序列化的相反操作,也 ...

  8. 14Flask重要知识

    一,李辉<Flask Web开发实战> 1,内网穿透 内网穿透工具可以快速让flask项目运行: 1,https://localtunnel.github.io/www/ 2,https: ...

  9. Netty源码解析 -- 零拷贝机制与ByteBuf

    本文来分享Netty中的零拷贝机制以及内存缓冲区ByteBuf的实现. 源码分析基于Netty 4.1.52 Netty中的零拷贝 Netty中零拷贝机制主要有以下几种 1.文件传输类DefaultF ...

  10. Linux 8个有力的Awk内建变量

    Awk 有几个非常强力的内置变量.通常来说,分为两种类型的内置变量: 第一种是定义的变量可以改变, 比如字段分隔(FS)与记录分隔(RS) 第二种是可以用来数据处理或者数据总结,比如记录数(NR)与字 ...