力扣第312场周赛+AcWing第70场周赛补题
力扣
一.按身高排序
1.原题链接:
2.解题思路:
如果后者身高大于前者身高,则交换身高同时交换姓名,最后输出names即可。
3.参考代码:
class Solution { public: vector<string> sortPeople(vector<string>& names, vector<int>& heights) { for(int i = 0; i < names.size(); i++){ for(int j = i + 1; j < names.size(); j++){ if(heights[j] > heights[i]){ swap(heights[j] , heights[i]); swap(names[j], names[i]); } } } return names; } };
2.按位与最大的最长子数组
1.原题链接:
2.解题思路:
根据按位与运算的特性,a AND b <= min(a, b),则题目转化为实际上就是求数组中最大的元素最多连续出现了几次。
3.参考代码:
class Solution { public: int longestSubarray(vector<int>& nums) { int MAX = 0; for(auto x : nums)MAX = max(MAX, x); int ans = 0, res = 0; for(auto & x : nums){ if(x == MAX)res++; else{ ans = max(ans, res); res = 0; } } ans = max(ans, res); return ans; } };
3.找到所有好下标
1.原题链接:
2.解题思路:
用数组f[n],g[n]分别记录好下标之前连续非递增的元素的个数以及之后连续非递减的元素的个数,最后若长度满足f[n],g[n]都大于k,则将好下标插入ans,最后输出ans即可。
3.参考代码:
class Solution { public: vector<int> goodIndices(vector<int>& nums, int k) { int n = nums.size(); vector<int>f(n), g(n); for(int i = 0; i < n; i++){ f[i] = 1; if(i && nums[i] <= nums[i - 1])f[i] = f[i - 1] + 1; } for(int i = n - 1; i >= 0; i--){ g[i] = 1; if(i + 1 < n && nums[i] <= nums[i + 1])g[i] = g[i + 1] + 1; } vector<int>ans; for(int i = k; i < n - k; i++){ if(f[i - 1] >= k && g[i + 1] >= k)ans.push_back(i); } return ans; } };
AcWing
一.两个素数
1.原题链接:
2.解题思路:
用p(m)判断m是否为素数。
3.参考代码:
#include<algorithm> #include<cstring> #include<bits/stdc++.h> using namespace std; bool p(int m) { if(m == 1)return 0; for(int i = 2; i <= m / i; i++){ if(m % i == 0)return false; return true; } } int main() { int x; cin >> x; for(int i = 2; i <= x / i; i++){ if(p(i) && p(x / i) && i <= x / i && x % i == 0){ cout << i << << x / i; } } return 0; }
二.减法操作
1.原题链接:
2.解题思路:
遍历数组,若元素为奇数,则自减一且后一元素也减一,若最终数组中的元素全为偶数或者为非负数,则说明可以满足题意,输出“YES”,反之输出“NO”;
3.参考代码:
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int main() { int n; cin >> n; vector<int>a(n); for(int i = 0; i < n; i++)cin >> a[i]; for(int i = 0; i < n - 1; i++){ if(a[i] % 2)a[i]--, a[i + 1]--; } int s = 0; for(int i = 0; i < n; i++){ s += a[i] % 2 || a[i] < 0; } if(!s)cout << "YES"; else cout << "NO"; return 0; }