LeetCodeWeeklyContest-155

2024-01-01 06:58
文章标签 155 leetcodeweeklycontest

本文主要是介绍LeetCodeWeeklyContest-155,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

操千曲而晓声,观千剑而后识器 ---- 《文心雕龙》

力扣的周赛自闭了,好久没写了,丢掉的改捡了。

题目传送

个人博客同步更新

Problem1 最小绝对差

  • 难度:Easy

题目

给你个整数数组 arr,其中每个元素都 不相同。
请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。

思路

  • 遍历,边找边push,只需一遍

貌似代码写复杂了

题解

#include<bits/stdc++.h>
using namespace std;
/*LeetCode WeeklyContest-155
*/
vector<vector<int> > minimumAbsDifference(vector<int>& arr) {sort(arr.begin(),arr.end());int n=arr.size();vector<vector<int> > result; int min = arr[1]-arr[0];vector<int> tmp;for(int i=0;i<n-1;i++){if(arr[i+1]-arr[i] < min){min = arr[i+1]-arr[i];result.clear();tmp.push_back(arr[i]);tmp.push_back(arr[i+1]);result.push_back(tmp);tmp.clear();}else if(arr[i+1]-arr[i] == min){tmp.push_back(arr[i]);tmp.push_back(arr[i+1]);result.push_back(tmp);tmp.clear();}else ;} return result;  
}// 测试下
int main()
{vector<int> v;v.push_back(-20);		v.push_back(11);		v.push_back(26);	v.push_back(27);v.push_back(40);	vector<vector<int> > result = minimumAbsDifference(v);vector<vector<int> >::iterator rIt;vector<int>::iterator it;for(rIt = result.begin();rIt!=result.end();rIt++){for(it = (*rIt).begin();it!=(*rIt).end();it++){cout << *it << " ";}cout << endl;}return 0;} 

Problem 2 丑数 III

题目

请你帮忙设计一个程序,用来找出第 n 个丑数。
丑数是可以被 a 或 b 或 c 整除的 正整数。
1 <= n, a, b, c <= 10^9
1 <= a * b * c <= 10^18
本题结果在 [1, 2 * 10^9] 的范围内

  • 难度:Medium

思路

  • 无脑暴力 1 到 min ⁡ ( n ∗ a , n ∗ b , n ∗ c ) 1到\min(n*a,n*b,n*c) 1min(na,nb,nc) 超时。
  • 无脑开个数组,把 i ∗ a 、 i ∗ b 、 i ∗ c i*a、i*b、i*c iaibic 其中 i = 1... n i=1...n i=1...n,然后写个sort(),直接取第n个数,内存爆掉。

以上都是不可取的
计算1~m之间有多少丑数,设为cnt,然后从n开始折半查找,判断cnt与n的关系,最后直接定位到第n个丑数。
另外,如何判断1~m之间有多少丑数?公式如下:
c n t = m / a + m / b + m / c − m / l c m ( a , b ) − m / l c m ( b , c ) − m / l c m ( a , c ) + m / l c m ( l c m ( a , b ) , c ) cnt = m/a + m/b + m/c - m/lcm(a,b)- m/lcm(b,c) - m/lcm(a,c) + m/lcm(lcm(a,b),c) cnt=m/a+m/b+m/cm/lcm(a,b)m/lcm(b,c)m/lcm(a,c)+m/lcm(lcm(a,b),c)
其中 l c m ( a , b ) lcm(a,b) lcm(a,b)是a、b的最小公倍数。

题解

/*LeetCode WeeklyContest-155
*/#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
// 避免超范围 ,不妨都写成ll
ll gcd(int x, int y){if(x>y) swap(x,y);int r = y%x;if(r==1) return 1;while(r){y = x;x = r;r = y%x;}return x;
}
ll lcm(int x, int y){return x/gcd(x,y)*y;
}
bool countLessN(ll m,int a,int b,int c,int n){int cnt = m/a + m/b + m/c- m/lcm(a,b) - m/lcm(b,c) - m/lcm(a,c) + m/lcm(lcm(a,b),c);return cnt >= n;
}
int nthUglyNumber(int n, int a, int b, int c) {ll begin =1,end=2e10+5;while(begin+1<end){  // 注意是begin+1<endint mid = (begin+end)/2;if(countLessN(mid,a,b,c,n))end = mid;else begin=mid;}return end;}
// 测试下
int main()
{int n,a,b,c;n = 1000000000, a = 2, b = 217983653, c = 336916467;cout << nthUglyNumber(n,a,b,c);return 0; 
}

Problem3

题目

给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。
你可以 任意多次交换 在 pairs 中任意一对索引处的字符。
返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。

  • 难度:Medium

思路

先根据索引对建立并查集,构成若干个连通分量,每个连通分量内部排序,使其排成最小字典序,然后再将排完序的连通分量复原,就可以得到最小字典序的字符串了。

题解

#include<bits/stdc++.h>
using namespace std;
vector<int> father,sz;
int find(int x){  // 并查集  查return father[x]==x?x:father[x] = find(father[x]);
}
string smallestStringWithSwaps(string s,vector<vector<int> > pairs){int n=s.size();father.resize(n);sz.resize(n); for(int i=0;i<n;i++){  // 初始化 father[i] = i;sz[i] = 1;}int n1 = pairs.size();for(int i=0;i<n1;i++){vector<int> tmp = pairs[i];int f1 = find(tmp[0]),f2=find(tmp[1]);if(f1!=f2){if(sz[f1]<sz[f2]){father[f1] = f2;sz[f2] += sz[f1];}else{father[f2] = f1;sz[f1] += sz[f2];}}}vector<vector<char> > charArr(n);  vector<vector<int> > posArr(n);// 并查集发挥作用 for(int i=0;i<n;i++){charArr[find(i)].push_back(s[i]);posArr[find(i)].push_back(i);	}// char数组排序 for(int i=0;i<charArr.size();i++){sort(charArr[i].begin(),charArr[i].end());}// 把排完序的联通块,合到一起 string s1(n,'\0');for(int i=0;i<n;i++){for(int j=0;j<charArr[i].size();j++){s1[posArr[i][j]] = charArr[i][j];}}return s1;		
}
// 测试下
int main()
{string s="cba";vector<vector<int> > v;vector<int> s1,s2;s1.push_back(0);s1.push_back(1);s2.push_back(1);s2.push_back(2);v.push_back(s1),v.push_back(s2);cout << smallestStringWithSwaps(s,v) << endl; return 0;
}

Problem4 项目管理

这篇关于LeetCodeWeeklyContest-155的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Leetcode面试经典150题-155.最小栈

解法都在代码里,不懂就留言或者私信 我写了两种解法,建议选择双栈的,感觉这才是考察点 /**一般解法:过个笔试没问题,建议用双栈的方法 */class MinStack2 {/**至少应该有一个栈用于保存数据 对于push和pop以及top的话,如果不考虑从栈中获取最小元素,那就是单纯的栈但是因为这个获取最小元素的方法,我们就得准备一个结构用于存放最小值,我这里想到的是最小堆*/Stack

LeetCode--155 最小栈

题目 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) -- 将元素 x 推入栈中。pop() -- 删除栈顶的元素。top() -- 获取栈顶元素。getMin() -- 检索栈中的最小元素。 示例 MinStack minStack = new MinStack();minStack.push(-2);minStack.push

力扣hot100:155. 最小栈(栈,辅助栈存储相关信息)

LeetCode:155. 最小栈 1、尝试单调栈 看到这题说,要常数时间内检索最小元素的栈,想到了单调栈,递增单调栈确实能维护最小值,但是这个最小值是存在一定意义的,即如果后面出现了最小值,那么前面的之前的最小值就会无效。 而本题存在弹出操作,这导致当前最小值可能会被丢弃,而需要使用之前的最小值,单调栈可能无法做到找回次小值。 能够弹出值且能一直保持维护数据的最小值的数据结构,是优先队

LeetCode 题解(155): Construct Binary Tree from Inorder and Postorder Traversal

题目: Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume that duplicates do not exist in the tree. 题解: 递归。 C++版: class Solution {public:TreeNode*

【155】linux中查看文件more、cat、less、tail、head用法

内容目录(原文见公众号python宝或DB宝) 一、cat 显示文件连接文件内容的工具       二、more 文件内容或输出查看工具; 三、less 查看文件内容 工具; 四、head 工具,显示文件内容的前几行; 五、tail 工具,显示文件内容的最后几行; 一、cat 显示文件连接文件内容的工具  1.1 cat 语法结构 cat [选项] [文件]...选项-A, --show-a

[LeetCode] 155. Min Stack

题目内容 https://leetcode-cn.com/problems/min-stack/ Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack.pop() -- Remo

Leetcode—155. 最小栈【中等】

2024每日刷题(130) Leetcode—155. 最小栈 实现代码 class MinStack {public:MinStack() {}void push(int val) {if(st.empty()) {st.emplace(val, val);} else {st.emplace(val, min(val, st.top().second));}}void pop()

leetcode热题HOT 155. 最小栈

一、问题描述: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int getMin() 获取堆栈中的最小元素。 二、解决方法:

LeetCode *** 155. Min Stack

题目: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -

Leetcode 41. 缺失的第一个正数和Leetcode 155. 最小栈

文章目录 Leetcode 41. 缺失的第一个正数题目描述C语言题解和思路解题思路 Leetcode 155. 最小栈题目描述C语言题解和思路解题思路 Leetcode 41. 缺失的第一个正数 题目描述 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: