你有一个长度为 n 的队伍,从左到右依次为 1~n,有 m 次插队行为,用数组 cutIn 进行表示,cutIn 的元素依次代表想要插队的人的编号,每次插队,这个人都会直接移动到队伍的最前方。你需要返回一个整数,代表这 m 次插队行为之后,有多少个人已经不在原来队伍的位置了。
3,[3, 2, 3]
2
初始队伍为 [1, 2, 3]3 开始插队 [3, 1, 2]2 开始插队 [2, 3, 1]3 开始插队 [3, 2, 1]所以2还在原来的尾置,3和1两个人已经不在原来的位置了。
3,[]
0
没有人进行插队,所有人都在自己原来的位置上。
对于所有数据,保证,
,且
class Solution {
public:
/**
* 计算有多少个人最终不在自己原来的位置上
* @param n int整型 队伍总长
* @param cutIn int整型vector 依次会插队到最前方的人的编号
* @return int整型
*/
int countDislocation(int n, vector<int>& cutIn) {
// write code here
map<int,int> vis;
int cnt = 0,maxv = 0;
int right = 0;
for(int i = cutIn.size()-1; ~i; -- i) {
if(!vis.count(cutIn[i]-1)) {
vis[cutIn[i]-1] = 1;
if(cutIn[i]-1 == cnt++) right ++;
maxv = max(maxv,cutIn[i]);
}
}
return maxv-right;
}
}; #include <unordered_map>
class Solution {
public:
/**
* 计算有多少个人最终不在自己原来的位置上
* @param n int整型 队伍总长
* @param cutIn int整型vector 依次会插队到最前方的人的编号
* @return int整型
*/
int countDislocation(int n, vector<int>& cutIn) {
unordered_map<int, bool> vis;
int m=cutIn.size(), Max=0, cnt=0;
for(int i=m-1,j=0;i>=0;i--){
if(vis.find(cutIn[i]-1)==vis.end()){
vis[cutIn[i]-1] = true;
if(cutIn[i]-1 == j++)
cnt++;
Max = max(Max, cutIn[i]);
}
}
return Max - cnt;
}
};
可分为没插过队的和插过队的两种
最后的排队,没插过队的都在后面
插过队的最大值是个分界线。
没插过队的小于这个分界线最后一定不在原来的位置,大于的一定在原来位置
插过队的,我们从后往前看,删除重复的,就是排队序列
class Solution: def countDislocation(self , n , cutIn ): # write code here cd = set() m = len(cutIn) if m==0: print(0) return res = max(cutIn) for i in range(m-1,-1,-1): if cutIn[i] not in cd: if cutIn[i]==len(cd)+1: res-=1 cd.add(cutIn[i]) return res
class Solution {
public:
/**
* 计算有多少个人最终不在自己原来的位置上
* @param n int整型 队伍总长
* @param cutIn int整型vector 依次会插队到最前方的人的编号
* @return int整型
*/
int countDislocation(int n, vector<int>& cutIn) {
vector<bool> a(n + 1, false);
int Max = 0, A = 0, N = 0;
for (int i = cutIn.size() - 1; i >= 0; i--) {
if (!a[cutIn[i]]) {
N += ++A == cutIn[i];
a[cutIn[i]] = true;
Max = max(Max, cutIn[i]);
}
}
return Max - N;
}
}; class Solution {
public:
/**
* 计算有多少个人最终不在自己原来的位置上
* @param n int整型 队伍总长
* @param cutIn int整型vector 依次会插队到最前方的人的编号
* @return int整型
*/
int countDislocation(int n, vector<int>& cutIn) {
// write code here
int res = 0, len = 0, MAX = -1;
set<int> s;
for(auto it = cutIn.rbegin(); it != cutIn.rend(); ++it){
if(s.find(*it) == s.end()){
MAX = max(MAX, *it);
s.insert(*it);
if(*it - len == 1)
res++;
len++;
}
}
return MAX - res;
}
}; class Solution {
public:
/**
* 计算有多少个人最终不在自己原来的位置上
* @param n int整型 队伍总长
* @param cutIn int整型vector 依次会插队到最前方的人的编号
* @return int整型
*/
int countDislocation(int n, vector<int>& cutIn) {
// write code here
int res = 0, len = 0, cnt = 0;
set<int> s;
vector<int> v;
for(auto it = cutIn.rbegin(); it != cutIn.rend(); ++it){
if(s.find(*it) == s.end()){
s.insert(*it);
v.push_back(*it);
if(*it - len == 1)
res++;
len++;
}
}
sort(v.begin(), v.end());
for(int a : v)
cout << a << " ";
cout << endl;
for(int i = 1, j = 0; j < v.size(); i = v[j] + 1, j++){
for(int k = i; k < v[j]; ++k){
if(k - len == 1)
res++;
len++;
}
}
for(int k = v[v.size()-1] + 1; k <= n; ++k){
if(k - len == 1)
res++;
len++;
}
return n - res;
}
}; class Solution: def countDislocation(self , n , cutIn ): if len(cutIn) == 0: return 0 nn = max(cutIn) cutIn.reverse() cut = sorted(set(cutIn), key=cutIn.index) sums = 0 for index, value in enumerate(cut): if index + 1 == value: sums += 1 return nn - sums
import java.util.*;
public class Solution {
/**
* 计算有多少个人最终不在自己原来的位置上
* @param n int整型 队伍总长
* @param cutIn int整型一维数组 依次会插队到最前方的人的编号
* @return int整型
*/
public int countDislocation (int n, int[] cutIn) {
// write code here
if(cutIn.length==0){
return 0;
}
int len=cutIn.length;
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
int index=1;
int max=Integer.MIN_VALUE;
for (int i = len-1; i >=0 ; i--) {
max=max>cutIn[i]?max:cutIn[i];
if(!map.containsKey(cutIn[i])){
map.put(cutIn[i],index++);
}
}
int num=0;
for(Integer key : map.keySet()){
if(map.get(key)!=key){
num++;
}
}
num+=(n-map.size())-(n-max);
return num;
}
}