第19场双周赛总结

2020-02-10

5311. 将数字变成 0 的操作次数

给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。

class Solution {
public:
    int numberOfSteps (int num) {
        int count = 0;
        while(num){
            if(num &1) num--;
            else num /= 2;
            count++;
        }
        return count;
    }
};

1343. 大小为 K 且平均值大于等于阈值的子数组数目

滑动串口,每次加上最后一个减去最前面一个;

class Solution {
public:
    int numOfSubarrays(vector<int>& arr, int k, int threshold) {
         int sum = k*threshold;
        int i, j;
        int count = 0;
        int temp = 0;//这里的初始化,永远的痛
        int n = arr.size();
        for(i = 0; i < k; i++)
            temp += arr[i];
        i = 0;
        j = k;
        while( j < n){
            if(temp >= sum) count++;
            temp += arr[j] - arr[i];
            j++;
            i++;
            //cout << temp << endl;
        }
        if(temp >= sum) count++;
        return count;
    }
};

5313. 时钟指针的夹角

给你两个数 hour 和 minutes 。请你返回在时钟上,由给定时间的时针和分针组成的较小角的角度(60 单位制)。

数学题:不过写得不够简洁:

class Solution {
public:
    double angleClock(int hour, int minutes) {
        double res;
        double h,m;
        m = minutes*6;
        h = hour*30 + minutes*0.5;
        if(h > m){
            res = h - m;
            if(res >= 180) return 360-res;
            else return res;
        }
        else{
            res = m - h;
            if(res >= 180) return 360-res;
            else return res;
        }
        return res;
    }
};

比较简洁:abs是求整数绝对值,fabs是求double和float的绝对值;

class Solution {
public:
    double angleClock(int hour, int minutes) {
        double k1 = 6 * minutes;
        double k2 = 30 * hour + 0.5 * minutes;
        return min(fabs(k1 - k2), 360 - fabs(k1 - k2));
    }
};

1345. 跳跃游戏 IV

给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。

每一步,你可以从下标 i 跳到下标:

i + 1 满足:i + 1 < arr.length
i - 1 满足:i - 1 >= 0
j 满足:arr[i] == arr[j] 且 i != j
请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。

注意:任何时候你都不能跳到数组外面。

数据量不能使用O(N^2)的算法:

T了:每次都找前一个或者后一个,然后遍历一遍整个数组查找相同的;

class Solution {
public:
    int minJumps(vector<int>& arr) {
        int n = arr.size();
        vector<int> vis(n,0);
        vis[0] = 1;
        queue<int> q;
        q.push(0);
        int res = 0;
        while(!q.empty()){
            int l = q.size();
            for(int i = 0; i <l; i++){
                int t = q.front();
                q.pop();
                //cout << arr[t] << ‘ ‘;
                if(t == n-1) return res;
                if(t-1>=0 && vis[t-1] == 0){
                     q.push(t-1);vis[t-1] =1;
                }
                if(t+1 < n && vis[t+1]== 0){
                       q.push(t+1); vis[t+1] =1;}
                for(int i = 0; i <n;i++){
                    if(vis[i] == 0 && arr[i] == arr[t] && i!= t){
                       q.push(i),vis[i] = 1;}
                }
            }
           //cout << endl;
            res++;
        }
        return res;
    }
};        

对map的运用还是不熟悉,虽然想到map了,但是还是想坐标与值的map,没有想到值与多个坐标的对应关系,之前没有遇到过:

class Solution {
public:
    map<int,vector<int>> mp;//这个没想到,整数对应数组
    int minJumps(vector<int>& arr) {
        int n = arr.size();
        for(int i = 0; i < n;i++) mp[arr[i]].push_back(i);
        vector<int> vis(n,0);
        vis[0] = 1;
        queue<int> q;
        q.push(0);
        int res = 0;
        while(!q.empty()){
            int len = q.size();
            while(len--){
                 int t = q.front();q.pop();
            if(t == n-1) return res;
            if(t-1>= 0 && !vis[t-1]++) q.push(t-1);
            if(t+1 < n && !vis[t+1]++) q.push(t+1);
            auto it = mp.find(arr[t]);
            if (it != mp.end()){
                for(auto x: mp[arr[t]]){
                    if(!vis[x]++) q.push(x);
                }
                mp.erase(it);// 如果没有,当数据有很多重复元素时,会退化成n的平方
            }
            }
            res++;
        }
        return res;
    }
};

原文地址:https://www.cnblogs.com/Aliencxl/p/12291375.html

时间: 2024-10-29 21:49:27

第19场双周赛总结的相关文章

LeetCode 第 14 场双周赛

基础的 api 还是不够熟悉啊 5112. 十六进制魔术数字 class Solution { public: char *lltoa(long long num, char *str, int radix) { const char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; unsigned long long unum; int i = 0, j, k; if(radix == 10 && num <

LeetCode双周赛10

Leetcode双周赛10 5079.三个有序数组的交集 给出三个均为 严格递增排列 的整数数组 arr1,arr2 和 arr3. 返回一个由 仅 在这三个数组中 同时出现 的整数所构成的有序数组. 示例: 输入: arr1 = [1,2,3,4,5], arr2 = [1,2,5,7,9], arr3 = [1,3,4,5,8] 输出: [1,5] 解释: 只有 1 和 5 同时在这三个数组中出现. 提示: 1 <= arr1.length, arr2.length, arr3.length

leetcode 双周赛 Biweekly Contest 6

最后一题比赛快结束的时候想到怎么做了(通过WA的数据猜出来的),比赛后10分钟做出来的.最终做了3题,时间1个小时左右吧. 1150. Check If a Number Is Majority Element in a Sorted Array 这道题理论应该用二分,但是数据量很小(1000),所以就直接暴力过了: class Solution { public: bool isMajorityElement(vector<int>& nums, int target) { int

leetcode 双周赛9 进击的骑士

一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右)走 1 格,再向上(或下)走 2 格:或先向左(或右)走 2 格,再向上(或下)走 1 格. 每次移动,他都可以按八个方向之一前进. 现在,骑士需要前去征服坐标为 [x, y] 的部落,请你为他规划路线. 最后返回所需的最小移动次数即可.本题确保答案是一定存在的. 示例 1: 输入:x = 2,

leetcode 双周赛9 找出所有行中最小公共元素

给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[1,2,3,4,5],[2,4,5,8,10],[3,5,7,9,11],[1,3,5,7,9]] 输出:5 解法: 暴力解法  就是使用哈希记录每行 然后比较 代码 class Solution { public: unordered_map<int, int> umap[510]; int smalle

[leetcode 双周赛 11] 1228 等差数列中缺失的数字

1228 Missing Number In Arithmetic Progression 等差数列中缺失的数字 问题描述 有一个数组, 其中的值符合等差数列的数值规律, 也就是说: 在?0 <= i < arr.length - 1?的前提下, arr[i+1] - arr[i]?的值都相等. 我们会从该数组中删除一个 既不是第一个 也 不是最后一个的值, 得到一个新的数组??arr. 给你这个缺值的数组?arr, 请你帮忙找出被删除的那个数. 示例 1: 输入: arr = [5,7,11

leetcode-12双周赛-1243-数组变换

题目描述: 自己的提交: class Solution: def transformArray(self, arr: List[int]) -> List[int]: if len(arr) < 3: return arr flag = True while flag: tmp = [] tmp.append(arr[0]) for i in range(1,len(arr)-1): if arr[i] > arr[i-1] and arr[i] > arr[i+1]: tmp.a

leetcode-12双周赛-1246-删除回文子数组

题目描述: 方法:区间dp O(N^3) class Solution: def minimumMoves(self, A: List[int]) -> int: N = len(A) dp = [[0] * (N+1) for _ in range(N+1)] for i in range(N+1): dp[i][i] = 1 for size in range(2, N+1): for i in range(N - size + 1): j = i + size - 1 dp[i][j] =

leetcode-第14周双周赛-1272-删除区间

题目描述: 自己的提交: class Solution: def removeInterval(self, intervals: List[List[int]], toBeRemoved: List[int]) -> List[List[int]]: res = [] for i in intervals: if i[0] >= toBeRemoved[1] or i[1] <= toBeRemoved[0]: res.append(i) else: if i[0] < toBeR