额外题目第1天|1365 941 1207 283 189 724 34 922 35 24

1365 暴力解法也能过

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> result(nums.size(), 0);
        for (int i=0; i<nums.size(); i++) {
            int count =0;
            for (int j=0; j<nums.size(); j++) {
                if (nums[j]<nums[i]) count++;
            }
            result[i]=count;
        }
        return result;
    }
}; 

优化 看了代码随想录的思路 其实本来自己想到了要sort就可以 但是没想到用一个hash来对应数值和数组中比他小的个数 填充hash时从后往前 这样相等的数值就会被覆盖成最前面的 

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> sorted = nums;
        sort(sorted.begin(), sorted.end());

        int hash[105] = {};
        for (int i=sorted.size()-1; i>=0; i--) {
            hash[sorted[i]]=i;
        }

        vector<int> result(nums.size(), 0);
        for (int i=0; i<nums.size(); i++) {
            result[i]=hash[nums[i]];
        }
        return result;
    }
};

941 我是按照顺序来遍历找山峰的 但这个逻辑确实是比较容易有所疏漏 所以第一次提交的时候忽略了单调递减这个情况 错误判断成了true

class Solution {
public:
    bool validMountainArray(vector<int>& arr) {
        if (arr.size()<3) {
            return false;
        }
        int i=1;
        while (i<arr.size() && arr[i]>arr[i-1]) {
            i++;
        }
        if (i>=arr.size() || arr[i]==arr[i-1] || i==1) {
            return false;
        }
        while (i<arr.size() && arr[i]<arr[i-1]) {
            i++;
        }
        if (i>=arr.size()) {
            return true;
        }
        return false;
    }
};

用双指针来写更加清晰且不易错 让i和j从两边单调递增到山峰 最后的i和j应该是会合且不在数组头尾 其他情况都return false

lass Solution {
public:
    bool validMountainArray(vector<int>& arr) {
        if (arr.size()<3) return false;
        int i=1;
        int j= arr.size()-2;
        while (i<arr.size() && arr[i]>arr[i-1]) i++;
        while (j>=0 && arr[j]>arr[j+1]) j--;
        i--; j++;
        if (i!=j || i==0 || j==arr.size()-1) return false;
        return true;
    }
};

1207 典型哈希表题目 出现的元素范围是-1000到1000 所以定义数组hash数出元素出现的个数 之后遍历整个hash数组 再映射到existed数组 如果hash数组的值>0则记为出现过 如果遍历到出现过的个数就return false

下面comment的是我自己想的用umap来写的 就是把每个次数map到第一个元素出现这么多次数的数上面去 遍历arr数组 通过hash值在map里找这个次数 如果找到就说明前面有过相同次数 return false

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        int hash[2001]={0};
        for (int i=0; i<arr.size(); i++) {
            hash[arr[i]+1000]++;
        }

        bool existed[2001]={false};
        for (int i=0; i<2000; i++) {
            if (existed[hash[i]]==true) return false;
            if (hash[i]>0) existed[hash[i]]=true;
        }
        return true;
        
        /* unordered_map<int, int> umap;
        for (int i=0; i<arr.size(); i++) {
            if (umap.find(hash[arr[i]+1000])==umap.end()) {
                umap[hash[arr[i]+1000]] = arr[i]+1000;
            }
            else {
                if (umap[hash[arr[i]+1000]] == arr[i]+1000) continue;
                else return false;
            }
        }
        return true; */
    }
};

 283 这个是我自己想的! 每次从头找第一个零 与他后面第一个非0交换位置 直到两个while loop任意一个到数组末尾为止

class Solution {
private:
    void swap(vector<int>& nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
public:
    void moveZeroes(vector<int>& nums) {
        while (true) {
            int i=0; 
            while (i<nums.size() && nums[i]!=0) i++;
            if (i==nums.size()) return;
            int j=i+1;
            while (j<nums.size() && nums[j]==0) j++;
            if (j==nums.size()) return;
            swap(nums,i,j);
        }
        return;
    }
};

这个思路是参考代码随想录之后写的 双指针法效率感觉更高!如果忘记思路了可以再去看一下那个动图 总结来说就是slow指针是一个一个走的 fast碰到有0的就跳过 每次让nums[slow]=nums[fast] 当fast走到末尾的时候 从slow现在的位置到末尾都赋值0

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slow=0;
        int fast=0;
        while(fast<nums.size()) {
            while (fast<nums.size() && nums[fast]==0) fast++;    
            if (fast==nums.size()) break;
            nums[slow]=nums[fast];
            slow++;
            fast++;
        }
        while (slow<nums.size()) {
            nums[slow++]=0;
        }
    }
};

189 double数组之后再赋值就可以!注意旋转方向

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k=k%nums.size();
        vector<int> double_nums(2*nums.size(),0);
        for (int i=0; i<double_nums.size(); i++) {
            double_nums[i] = nums[i%nums.size()];
        }
        for (int i=0; i<nums.size(); i++) {
            nums[i]=double_nums[i+nums.size()-k];
        }
    }
};

method 2 先反转整个数组 再反转前k个和后面的(这是向右轮转)

--diff 向右转就是前k个 向左转是后k个

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        //method 2
        k=k%nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin()+k);
        reverse(nums.begin()+k, nums.end());
    }
};

 724 本来想用双指针做 但因为数组里会有负数所以还是用动态规划来做比较好 (其实这里的left和right不需要是数组 是variable就可以了 每次覆盖就ok

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        vector<int> left(nums.size(), 0);
        vector<int> right(nums.size(),0);
        left[0]=0;
        for (int i=1; i<nums.size(); i++) {
            right[0]+=nums[i];
        }

        if (left[0]==right[0]) return 0;
        for (int i=1;i<nums.size(); i++) {
            left[i]=left[i-1]+nums[i-1];
            right[i]=right[i-1]-nums[i];
            if (left[i]==right[i]) return i;
        }
        
        return -1;
    }
};

34 二分查找题 一定一定要记得是什么区间 这里是左闭右闭 所以更新mid的时候是left=mid+1 or right = mid-1 才能终止while loop

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left = 0; 
        int right = nums.size()-1; 
        int mid=0;
        while (left<=right) {
            mid = (left+right)/2;
            if (nums[mid]==target) break;
            if (nums[mid]>target) right=mid-1;
            else if (nums[mid]<target) left=mid+1;
        }

        vector<int> result = {-1,-1};
        if (nums.size() == 0 || nums[mid]!=target) return result;

        int first=mid; int last=mid;
        while (first>=0 && nums[first]==target) first--;
        first++;
        while (last<nums.size() && nums[last]==target) last++;
        last--;

        result[0]=first; result[1]=last;
        return result;
    }
};

922 双指针法 i指向偶数位 j指向奇数位 遇到合格的就跳过 两个都是不合格的就互换位置 一直到任意一个遍历完整个数组位置

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        int i=0;
        int j=1;
        while (i<nums.size() && j<nums.size()) {
            while (i<nums.size() && nums[i]%2==0) i=i+2;
            while (j<nums.size() && nums[j]%2==1) j=j+2;
            if (i>=nums.size() || j>=nums.size()) break;
            int temp = nums[i];
            nums[i]=nums[j];
            nums[j]=temp;
        }
        return nums;
    }
};

35 二分查找经典模版 但return的时候要判断一下是放在mid前面还是后面

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0; int right = nums.size()-1;
        int mid=0;
        while (left<=right) {
            mid = (left+right)/2;
            cout<<"mid = "<<mid<<endl;
            if (target==nums[mid]) return mid;
            if (target>nums[mid]) left = mid+1;
            else if (target<nums[mid]) right=mid-1;
        }
        if (nums[mid]>target) return mid;
        return mid+1;
    }
};

24 记得加dummy_head会好写一点 要单独考虑特殊情况 用curr来遍历整个链表

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummy_head = new ListNode(0, head);
        ListNode* curr = dummy_head;
        while (curr!=nullptr) {
            ListNode* temp = curr->next;
            if (temp==nullptr || temp->next == nullptr) break;
            ListNode* temp1 = temp->next->next;
            curr->next = temp->next;
            curr->next->next = temp;
            temp->next = temp1;
            curr = curr->next->next;
        }
        return dummy_head->next;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/48174.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无涯教程-jQuery - jQuery.getScript( url, callback )方法函数

jQuery.getScript(url&#xff0c;[callback])方法使用HTTP GET请求加载并执行JavaScript文件。 该方法返回XMLHttpRequest对象。 jQuery.getScript( url, [callback] ) - 语法 $.getScript( url, [callback] ) 这是此方法使用的所有参数的描述- url - 包含请求…

Educational Codeforces Round 152 (Rated for Div. 2) B. Monsters

很早想到%K排序,但是就是WA2,心态崩了,昨天晚上差点睡不着觉吐了,感觉自己好笨啊啊啊, 言归正传, 按照正常的思路,样例是可以过的,但是AC不了,例如给出样例3 3 3 1 2 经过自己模拟应该输出1 3 2 ,但是只会输出1 2 3 ,知道症结所在debug,0的先输出,之后输出k-1,k-2…但是怎么实现…

物联网的通信协议

物联网的通信协议 目录 物联网的通信协议一、UART串口通信1.1 串口通信1.2 异步收发1.3 波特率1.4 串口通信协议的数据帧1.5 优缺点1.5.1 优点1.5.2 缺点 二、I^2^C2.1 I^2^C2.2 I^2^C2.3 数据有效性2.4 起始条件S和停止条件P2.5 数据格式2.6 协议数据单元PDU2.7 优缺点2.7.1 优…

Python教程三:Python基本概念

1、Python基本语法 Python中严格区分大小写Python中每一行就是一条语句&#xff0c;每条语句以换行结束每一行语句不建议过长&#xff08;一般不建议超过80个字符&#xff09;一条语句可以多行编写&#xff0c;语句后加\结尾Python是缩进严格的语言&#xff0c;所以在Python中…

RNN架构解析——注意力机制

目录 注意力机制实现 注意力机制 实现

导出为PDF加封面且分页处理dom元素分割

文章目录 正常展示页面导出后效果代码 正常展示页面 导出后效果 代码 组件内 <template><div><div><div class"content" id"content" style"padding: 0px 20px"><div class"item"><divstyle"…

栈粉碎原理分析

栈粉碎原理分析 源代码如下 #include <stdio.h>void function(int a, int b) {char buffer[12];gets(buffer);//long* ret (long *) ((long)buffer28);//*ret *ret 7;return; }void main() {int x;x 0;function(1,2);x 1;printf("%d\n",x); } 由解注释前…

windows C++多线程同步<3>-互斥量

windows C多线程同步&#xff1c;3&#xff1e;-互斥量 概念&#xff0c;如下图&#xff1a; 另外就是互斥对象谁拥有&#xff0c;谁释放 那么一个线程允许多次获取互斥对象吗&#xff1f; 答案是允许&#xff0c;但是申请多次就要释放多次&#xff0c;否则其他线程获取不到互…

「分享」Word文档被锁定无法编辑怎么办?4种方法解决

有没有遇到这种情况&#xff1f;打开Word文档后&#xff0c;发现文档被锁定了&#xff0c;无法输入内容&#xff0c;也无法修改&#xff0c;这很大可能是Word文档被设置了“限制编辑”。 如果Word文档被设置了“限制编辑”&#xff0c;而我们又需要编辑文档&#xff0c;可以用…

等分切割图片的方法

在做数据集的过程中&#xff0c;有时候需要将大图进行切分成小图片&#xff0c;一方面是为了满足训练需要&#xff0c;一方面是为了扩增数据集。 如下图的尺寸为5472x3648,但是我用不着这么大的图片&#xff0c;需要将图9等分 市面上也有等分切割图片的软件或者网站&#xff…

tensorRT多batch动态推理

tensorRT的多batch推理&#xff0c;导出的onnx模型必须是动态batch&#xff0c;只需在导出的时候&#xff0c;设置一个dynamic_axis参数即可。 torch.onnx.export(hybrik_model, dummy_input, "./best_model.onnx", verboseTrue, input_namesinput_names, \output_…

19 QListWidget控件

Tips: 对于列表式数据可以使用QStringList进行左移一块输入。 代码&#xff1a; //listWidget使用 // QListWidgetItem * item new QListWidgetItem("锄禾日当午"); // QListWidgetItem * item2 new QListWidgetItem("汗滴禾下土"); // ui->…

树状数组1

五分钟丝滑动画讲解 | 树状数组_哔哩哔哩_bilibili (23条消息) 树状数组(详细分析应用)&#xff0c;看不懂打死我!_树形数组_鲜果维他命的博客-CSDN博客 注意&#xff1a; 1、树状数组一般的数组一般从下标1开始赋值0作为一个边界 &#xff0c;lowbit&#xff08;0&#…

apple pencil值不值得购买?便宜的电容笔推荐

如今&#xff0c;对ipad使用者而言&#xff0c;苹果原装的Pencil系列无疑是最佳的电容笔。只是不过这款电容笔的售价&#xff0c;实在是太高了&#xff0c;一般的用户都无法入手。因此&#xff0c;在具体的使用过程中&#xff0c;如何选用一种性能优良、价格低廉的电容笔是非常…

Python数据可视化工具——Pyecharts

目录 1 简介绘图前先导包 2 折线图3 饼图4 柱状图/条形图5 散点图6 箱线图7 热力图8 漏斗图9 3D柱状图10 其他&#xff1a;配置项 1 简介 Pyecharts是一款将python与echarts结合的强大的数据可视化工具 Pyecharts是一个用于生成echarts图表的类库。echarts是百度开源的一个数据…

以智慧监测模式守护燃气安全 ,汉威科技“传感芯”凸显智慧力

城市燃气工程作为城市基建的重要组成部分&#xff0c;与城市居民生活、工业生产紧密相关。提升城市燃气服务质量和安全水平&#xff0c;也一直是政府和民众关注的大事。然而&#xff0c;近年来居民住宅、餐饮等工商业场所燃气事故频发&#xff0c;时刻敲响的警钟也折射出我国在…

大数据课程D1——hadoop的初识

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解大数据的概念&#xff1b; ⚪ 了解大数据的部门结构&#xff1b; ⚪ 了解hadoop的定义&#xff1b; ⚪ 了解hadoop的发展史&#xff1b; 一、大数据简介 1. 概述…

简要介绍 | 自回归生成:探索序列的未来之旅

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对Autoregressive Generation进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 自回归生成&#xff1a;探索序列的未来之旅 Approach - Autoregressive Conditional Generation using Transformer…

【Ajax】笔记-jsonp实现原理

JSONP JSONP是什么 JSONP(JSON With Padding),是一个非官方的跨域解决方案&#xff0c;纯粹凭借程序员的聪明才智开发出来的&#xff0c;只支持get请求。JSONP 怎么工作的&#xff1f; 在网页有一些标签天生具有跨域能力&#xff0c;比如&#xff1a;img link iframe script. …

启用、禁用员工账号

接口相关信息 controller层 /** 启用禁用员工账号* */PostMapping("/status/{status}")ApiOperation("启用禁用员工账号")public Result startOrStop(PathVariable Integer status, Long id) {log.info("启用禁用员工{}&#xff0c;{}",status,i…