备赛蓝桥杯--算法题目(2)

1. 排序数组

. - 力扣(LeetCode)

复制代码
class Solution {
    void heapSort(vector<int>& nums)
    {
        for(int i=0;i<nums.size();i++)
        {
            heapInsert(nums,i);
        }
        int l=nums.size();
        while(l)
        {
            swap(nums[0],nums[l-1]);
            l--;
            heapIfy(nums,0,l);
        }
    }
    void heapInsert(vector<int>& nums,int i)
    {
        while(nums[i]>nums[(i-1)/2])
        {
            swap(nums[i],nums[(i-1)/2]);
            i=(i-1)/2;
        }
    }
    void heapIfy(vector<int>& nums,int i,int size)
    {
        int l=2*i+1;
        while(l<size)
        {
            int best=((l+1)<size)&&(nums[l+1]>nums[l])?l+1:l;
            if(nums[best]<nums[i])
            {
                best=i;
            }
            if(best==i)
            {
                break;
            }
            swap(nums[i],nums[best]);
            i=best;
            l=2*i+1;
        }
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        heapSort(nums);
        return nums;
    }
};
2. 寻找峰值

. - 力扣(LeetCode)

复制代码
class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int l=0,r=nums.size()-1;
        if(nums.size()==1)
        {
            return 0;
        }
        if(nums[l]>nums[l+1])
        {
            return l;
        }
        if(nums[r]>nums[r-1])
        {
            return r;
        }
        int ans=-1;
        while(l<=r)
        {
            int m=l+((r-l)>>1);
            if(nums[m+1]>nums[m])
            {
                l=m+1;
            }
            else if(nums[m-1]>nums[m]){
                r=m-1;
            }
            else{
                ans=m;
                break;
            }
        }
        return ans;
    }
};
3. 合并k个链表
复制代码
class Solution {
public:
    struct Status {
        int val;
        ListNode *ptr;
        bool operator < (const Status &rhs) const {
            return val > rhs.val;
        }
    };

    priority_queue <Status> q;

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        for (auto node: lists) {
            if (node) q.push({node->val, node});
        }
        ListNode head, *tail = &head;
        while (!q.empty()) {
            auto f = q.top(); q.pop();
            tail->next = f.ptr; 
            tail = tail->next;
            if (f.ptr->next) q.push({f.ptr->next->val, f.ptr->next});
        }
        return head.next;
    }
};
4. 将数组和减半的最小次数

2208. 将数组和减半的最少操作次数 - 力扣(LeetCode)

复制代码
class Solution {
public:
    int halveArray(vector<int>& nums) {
       priority_queue<long> q;
       long sum=0;
       for(int i=0;i<nums.size();i++)
       {
            long tmp=(long)nums[i]<<20;
            q.push(tmp);
            sum+=tmp;
       }
       long sum2=sum>>1;
       int con=0;
       while(sum2>0)
       {
            long m=q.top();
            q.pop();
            sum2-=m/2;
            q.push(m/2);
            con++;
       } 
       return con;
    }
};
5. 交换数字

面试题 16.01. 交换数字 - 力扣(LeetCode)

复制代码
class Solution {
public:
    vector<int> swapNumbers(vector<int>& numbers) {
        numbers[0]=numbers[0]^numbers[1];
        numbers[1]=numbers[0]^numbers[1];
        numbers[0]=numbers[0]^numbers[1];;
        return numbers;
    }
};
6. 找到所有数组中消失的数字

448. 找到所有数组中消失的数字 - 力扣(LeetCode)

复制代码
class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        int n = nums.size();
        for (auto& num : nums) {
            int x = (num - 1) % n;
            if(nums[x]<=n)
            nums[x] += n;
        }
        vector<int> ret;
        for (int i = 0; i < n; i++) {
            if (nums[i] <= n) {
                ret.push_back(i + 1);
            }
        }
        return ret;
    }
};
7. 只出现一次的数字

LCR 004. 只出现一次的数字 II - 力扣(LeetCode)

复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        vector<int> tmp(32,0);
        for(auto& m: nums)
        {
            for(int i=0;i<tmp.size();i++)
            {
                tmp[i]+=(m>>i)&1;
            }
        }
        int res=0;
        for(int i=0;i<tmp.size();i++)
        {
            if(tmp[i]%3!=0)
            {
                res|=1<<i;
            }
        }
        return res;
    }
};
相关推荐
H.莓飛8 分钟前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia62621 分钟前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
和裕38 分钟前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
朝朝辞暮i43 分钟前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
淡海水1 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
无忧.芙桃2 小时前
C++语言原理与实践(十):vector类的底层实现
开发语言·c++·算法
乐迪信息2 小时前
AI防爆摄像机,监测港口船舶航行偏航隐患
大数据·人工智能·深度学习·算法·计算机视觉
0+1113 小时前
算法 --模拟
c++·算法·leetcode
青山是哪个青山3 小时前
LeetCode 300:最长递增子序列
算法
hetao17338373 小时前
2026-10-01~02 hetao1733837 的刷题记录
c++·算法