LeetCode 171周赛题解

1317. 将整数转换为两个无零整数的和

 1 class Solution {
 2 public:
 3     bool check(int n){
 4         while(n){
 5             if(n%10==0){
 6                 return false;
 7             }
 8             n=n/10;
 9         }
10         return true;
11     }
12     vector<int> getNoZeroIntegers(int n) {
13         for(int i=1;i<=n;i++){
14             if(check(i)&&check(n-i))return {i,n-i};
15         }
16         return {};
17     }
18 };

1318. 或运算的最小翻转次数

 1 class Solution {
 2 public:
 3     int minFlips(int a, int b, int c) {
 4         int cnt=0;
 5         while(a>0||b>0||c>0){
 6             int m=a&1,n=b&1,k=c&1;
 7             if((m|n)!=k){
 8                 if(k==1){
 9                     cnt++;
10                     //cout<<cnt<<endl;
11                 }else{
12                     if(m==1&&n==1)cnt+=2;
13                     else cnt++;
14                     //cout<<cnt;
15                 }
16             }
17             a=a>>1;
18             b=b>>1;
19             c=c>>1;
20         }
21         return cnt;
22     }
23 };

1319. 连通网络的操作次数

解法一:并查集:

 1 const int maxn=1e5+10;
 2 int father[maxn];
 3 class Solution {
 4 public:
 5     //是一个图论的问题。。。
 6     //首先计算一下连通图的数量,一个连通图的最小边就是机子个数减一,剩下的线如果等于连通图数减一,那么就是符合条件的。。。
 7     //如何计算连通图的数量???
 8     int find(int x){
 9         while(father[x]!=x){
10             x=father[x];
11         }
12         return x;
13     }
14     void Uni(int a,int b){
15         int f1=find(a);
16         int f2=find(b);
17         if(f1>f2)swap(f1,f2);
18         father[f2]=f1;
19     }
20     int makeConnected(int n, vector<vector<int>>& connections) {
21         int m=connections.size();//表示的是总共有多少条边;
22         //使用并查集求解连通图的数量.
23         if(m<n-1)return -1;
24         for(int i=0;i<n;i++){
25             father[i]=i;//初始化
26         }
27         //set<int>cl;
28         for(int i=0;i<m;i++){
29             int k=connections[i][0],p=connections[i][1];
30             // cl.insert(k);
31             // cl.insert(p);
32             Uni(k,p);
33         }
34         //int num=cl.size()-1;//表示的是结点数量减一,即所需要的最少边的数量。
35         int cnt=0;
36         for(int i=0;i<n;i++){
37             if(father[i]==i)cnt++;
38         }
39         return cnt-1;//最小的需要线路是连通图数减一,不需要使用set
40
41     }
42 };

解法二:DFS

 1 const int maxn=1e5+10;
 2 vector<int>E[maxn];
 3 class Solution {
 4 public:
 5     //DFS解法,DFS需要注意的是,这个connections图是单向的图,但是DFS需要的是双向的图。。。
 6     void dfs(int x,vector<int>&vis){
 7         vis[x]=1;
 8         for(int i=0;i<E[x].size();i++){
 9             int v=E[x][i];
10             if(vis[v]==0){
11                 dfs(v,vis);
12             }
13         }
14     }
15     int makeConnected(int n, vector<vector<int>>& connections) {
16         int m=connections.size();
17         vector<int>vis(n+1,0);//表示的是初始化为没有访问,初始化为0;
18         int cnt=0;//表示的是总共有多少个连通块。。。
19         if(m<n-1)return -1;//直接返回-1,因为边小于结点数-1,那么无论如何都组不成连通图。。。
20         for(int i=0;i<m;i++){
21             E[connections[i][0]].push_back(connections[i][1]);
22             E[connections[i][1]].push_back(connections[i][0]);
23         }
24         for(int i=0;i<n;i++){
25             if(vis[i]==0){
26                 dfs(i,vis);
27                 cnt++;
28             }
29         }//这样就求出了连通图的数量。。。
30         return cnt-1;
31     }
32 };

1320. 二指输入的的最小距离

 1 int dp[350][27][27];//dp[i][j][k]表示的是在第i个位置上,第一个手指的字符为j,第二个手指的字符为K
 2 int n;
 3 const int maxn=10086;
 4 class Solution {
 5 public:
 6     //先写一个代价函数,求出相应的代价的.
 7     int Cost(int a,int b){
 8         //if(a==26||b==26)return 0;
 9         return abs(a/6-b/6)+abs(a%6-b%6);
10     }
11     int minimumDistance(string word) {
12         memset(dp,maxn,sizeof(dp));
13         n=word.length();
14         for(int i=0;i<26;i++){
15             for(int j=0;j<26;j++){
16                 dp[0][i][j]=0;//初始化将第0个位置不放元素这个是为了方便之后的操作。。。方便后面dp操作
17             }
18         }
19         for(int i=1;i<=n;i++){
20             int m=word[i-1]-‘A‘;//我们都是从阿拉伯数字开始算起的
21             for(int j=0;j<26;j++){
22                 for(int k=0;k<26;k++){
23                     if(dp[i-1][j][k]!=maxn){
24                         dp[i][m][k]=min(dp[i-1][j][k]+Cost(j,m),dp[i][m][k]);
25                         dp[i][j][m]=min(dp[i-1][j][k]+Cost(k,m),dp[i][j][m]);//为什么可能是本身.
26                         //因为有可能两个单词相同。
27                     }
28                 }
29             }
30         }
31         int min_num=maxn;
32         for(int i=0;i<26;i++){
33             for(int j=0;j<26;j++){
34                 if(dp[n][i][j]!=maxn){
35                     min_num=min(min_num,dp[n][i][j]);
36                 }
37             }
38         }
39         return min_num;
40
41     }
42 };

原文地址:https://www.cnblogs.com/zb121/p/12416514.html

时间: 2024-10-03 01:26:36

LeetCode 171周赛题解的相关文章

Leetcode 184周赛题解

前一宿没睡好,困的不行,写的有点慢.. 5380. 数组中的字符串匹配 题目描述: 给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词.请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词.如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串. 题解: 两次遍历,用kmp判断一下是否是字串. AC代码: class Solution { public: in

Leetcode 第174场周赛 题解

Leetcode 第174场周赛 题解 方阵中战斗力最弱的 K 行 签到题,统计一下每行的军人数量,然后设置一下排序规则即可. 时间复杂度 \(O(nlogn)\) typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i --) #define INF 0x3f3f3f3f3f3f3f3

Leetcode 第175场周赛 题解(完结)

Leetcode 第175场周赛 题解 检查整数及其两倍数是否存在 数据范围小的可怜,\(O(n^2)\) 解法可行.如果范围大一点,可以先进行排序然后遍历每一个数进行二分查找,时间复杂度 \(O(nlogn)\) 代码是平方解法. typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i

LeetCode: Permutation Sequcence 题解

The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order,We get the following sequence (ie, for n = 3): "123" "132" "213" "231" "312" "3

LeetCode: Sort Colors 题解

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, and bl

LeetCode: Triangle 题解

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to bottom is 11 (i

LeetCode: Two Sum 题解

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that

LeetCode: Generate Parentheses 题解

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 题解: 很容易

LeetCode:Combinations 题解

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example,If n = 4 and k = 2, a solution is: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]DFS,递归 1 class Solution { 2 public: 3 vector<vector<int> > an