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

1. 链表求和

. - 力扣(LeetCode)

复制代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *head = nullptr, *tail = nullptr;
        int carry = 0;
        while (l1 || l2) {
            int n1 = l1 ? l1->val: 0;
            int n2 = l2 ? l2->val: 0;
            int sum = n1 + n2 + carry;
            if (!head) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail->next = new ListNode(sum % 10);
                tail = tail->next;
            }
            carry = sum / 10;
            if (l1) {
                l1 = l1->next;
            }
            if (l2) {
                l2 = l2->next;
            }
        }
        if (carry > 0) {
            tail->next = new ListNode(carry);
        }
        return head;
    }
};
2. 分割链表

. - 力扣(LeetCode)

复制代码
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* shead=new ListNode;
        ListNode* srear=shead;
        ListNode* bhead=new ListNode;
        ListNode* brear=bhead;
        ListNode* tmp=head;
        while(tmp)
        {
            if((tmp->val)>=x)
            {
                if(bhead==nullptr)
                {
                    bhead=brear=tmp;
                }
                else{
                    brear->next=tmp;
                    brear=brear->next;
                }
            }
            else{
                if(shead==nullptr)
                {
                    shead=srear=tmp;
                }
                else{
                    srear->next=tmp;
                    srear=srear->next;
                }
            }
            tmp=tmp->next;
        }
        brear->next=nullptr;
        srear->next=bhead->next;
        return shead->next;
    }
};
3. 最小栈

. - 力扣(LeetCode)

复制代码
class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {
        s1=new stack<int>;
        s2=new stack<int>;
    }
    
    void push(int x) {
        s1->push(x);
        if(s2->empty())
        {
            s2->push(x);
        }
        else{
            if(x<=s2->top())
            {
                s2->push(x);
            }
        }
    }
    
    void pop() {
        if(s1->top()==s2->top())
        {
            s2->pop();
        }
        s1->pop();
    }
    
    int top() {
        return s1->top();
    }
    
    int getMin() {
        return s2->top();
    }
private:
    stack<int>* s1;
    stack<int>* s2;
};
4. 二叉树的前序,中序,后序遍历

. - 力扣(LeetCode)

复制代码
#include<stack>
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> tmp;
       if(root!=nullptr)
       {
            TreeNode* head=root;
            stack<TreeNode*> s;
            s.push(head);
            while(!s.empty())
            {
                head=s.top();
                tmp.push_back(head->val);
                s.pop();
                if(head->right!=nullptr)
                {
                    s.push(head->right);
                }
                if(head->left!=nullptr)
                {
                    s.push(head->left);
                }
            }
       }
       return tmp;
    }
};

. - 力扣(LeetCode)

复制代码
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> tmp;
        stack<TreeNode*> s;
        TreeNode* head=root;
        while(!s.empty()||head!=nullptr)
        {
            while(head!=nullptr)
            {
                s.push(head);
                head=head->left;
            }
            head=s.top();
            tmp.push_back(head->val);
            s.pop();
            head=head->right;
        }
        return tmp;
    }
};

. - 力扣(LeetCode)

复制代码
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> tmp;
        stack<TreeNode*> s;
        TreeNode* head=root;
        TreeNode* ptr=root;
        while(!s.empty()||head!=nullptr)
        {
            while(head!=nullptr)
            {
                s.push(head);
                head=head->left;
            }
            head=s.top();
            s.pop();
            if(head->right==nullptr||head->right==ptr)
            {
                tmp.push_back(head->val);
                ptr=head;
                head=nullptr;
            }
            else{
                s.push(head);
                head=head->right;
            }
        }
        return tmp;
    }
};
5. 设计循环队列

. - 力扣(LeetCode)

复制代码
class MyCircularQueue {
private:
    int front;
    int rear;
    int capacity;
    vector<int> elements;

public:
    MyCircularQueue(int k) {
        this->capacity = k + 1;
        this->elements = vector<int>(capacity);
        rear = front = 0;
    }

    bool enQueue(int value) {
        if (isFull()) {
            return false;
        }
        elements[rear] = value;
        rear = (rear + 1) % capacity;
        return true;
    }

    bool deQueue() {
        if (isEmpty()) {
            return false;
        }
        front = (front + 1) % capacity;
        return true;
    }

    int Front() {
        if (isEmpty()) {
            return -1;
        }
        return elements[front];
    }

    int Rear() {
        if (isEmpty()) {
            return -1;
        }
        return elements[(rear - 1 + capacity) % capacity];
    }

    bool isEmpty() {
        return rear == front;
    }

    bool isFull() {
        return ((rear + 1) % capacity) == front;
    }
};
6. 排序数组

. - 力扣(LeetCode)

复制代码
static int first,last;
class Solution {
    vector<int> tmp;
    void mergeSort(vector<int>& nums, int l, int r) {
        if (l >= r) return;
        int mid = (l + r) >> 1;
        mergeSort(nums, l, mid);
        mergeSort(nums, mid + 1, r);
        int i = l, j = mid + 1;
        int cnt = 0;
        while (i <= mid && j <= r) {
            if (nums[i] <= nums[j]) {
                tmp[cnt++] = nums[i++];
            }
            else {
                tmp[cnt++] = nums[j++];
            }
        }
        while (i <= mid) {
            tmp[cnt++] = nums[i++];
        }
        while (j <= r) {
            tmp[cnt++] = nums[j++];
        }
        for (int i = 0; i < r - l + 1; ++i) {
            nums[i + l] = tmp[i];
        }
    }

    void randomized_quicksort(vector<int>& nums, int l, int r) {
        if (l < r) {
            int j = rand() % (r - l + 1) + l;
            first=l,last=r;
            int i=l,x=nums[j];
        while(i<=last)
        {
            if(nums[i]==x)
            {
                i++;
            }
            else if(nums[i]<x)
            {
                swap(nums[first++],nums[i++]);
            }
            else{
                swap(nums[last--],nums[i]);
            }
        }
            int left=first,right=last;
            randomized_quicksort(nums, l, left - 1);
            randomized_quicksort(nums, right + 1, r);
        }
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        srand((unsigned)time(NULL));
        tmp.resize((int)nums.size(), 0);
        //mergeSort(nums, 0, (int)nums.size() - 1);
        randomized_quicksort(nums,0,(int)nums.size() - 1);
        return nums;
    }
};
7. 求数组第k个最大元素

. - 力扣(LeetCode)

复制代码
static int first,last;
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        int m=nums.size()-k;
        srand((unsigned)time(NULL));
        return test(nums,m);
    }

    int test(vector<int>& nums,int i)
    {
        int ans = 0;
		for (int l = 0, r =nums.size() - 1; l <= r;) {
			partition(nums, l, r, nums[l + rand()%(r-l+1)]);
			if (i < first) {
				r = first - 1;
			} else if (i > last) {
				l = last + 1;
			} else {
				ans = nums[i];
				break;
			}
		}
		return ans;
    }

	void partition(vector<int>& nums, int l, int r, int x) {
		first = l;
		last = r;
		int i = l;
		while (i <= last) {
			if (nums[i] == x) {
				i++;
			} else if (nums[i] < x) {
				swap(nums[first++],nums[i++]);
			} else {
				swap(nums[last--],nums[i]);
			}
		}
	}
};
相关推荐
先做个垃圾出来………几秒前
差分数组(Difference Array)
java·数据结构·算法
hansang_IR24 分钟前
【题解】洛谷 P4286 [SHOI2008] 安全的航线 [递归分治]
c++·数学·算法·dfs·题解·向量·点积
乐迪信息24 分钟前
乐迪信息:AI摄像机在智慧煤矿人员安全与行为识别中的技术应用
大数据·人工智能·算法·安全·视觉检测
多恩Stone1 小时前
【3DV 进阶-2】Hunyuan3D2.1 训练代码详细理解下-数据读取流程
人工智能·python·算法·3d·aigc
惯导马工2 小时前
【论文导读】IDOL: Inertial Deep Orientation-Estimation and Localization
深度学习·算法
老姜洛克2 小时前
自然语言处理(NLP)之n-gram从原理到实战
算法·nlp
CoovallyAIHub3 小时前
基于YOLO集成模型的无人机多光谱风电部件缺陷检测
深度学习·算法·计算机视觉
CoovallyAIHub3 小时前
几十个像素的小目标,为何难倒无人机?LCW-YOLO让无人机小目标检测不再卡顿
深度学习·算法·计算机视觉
怀旧,3 小时前
【C++】19. 封装红⿊树实现set和map
linux·c++·算法
往事随风去3 小时前
Redis的内存淘汰策略(Eviction Policies)有哪些?
redis·后端·算法