C++OJ题经验总结(竞赛)4

注意:本篇标红字段均是可纳为己用的经验条。
OJ题知识归属:

1、第一题:动态规划 -> 区间dp(基于区间上某⼀点,划分成左右区间讨论)(线形)

2、第二题:顺序表 -> 双指针

3、第三题:顺序表 -> 双指针

4、第四题:链表 -> 双指针

5、第五题:链表 -> 双指针

6、第六题:链表 -> 双指针
OJ题来源:洛谷

OJ题名:248

OJ题归属:动态规划【区间dp】

解题算法:动态规划

五板斧:

cpp 复制代码
#include<iostream>

using namespace std;

const int N = 255;

int n;
int a[N];
int f[N][N];

int main()
{
	cin >> n;
	int ret = 0;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];

		f[i][i] = a[i];
		ret = max(ret, a[i]);
	}

	for (int len = 2; len <= n; len++)
	{
		for (int i = 1; i + len - 1 <= n; i++)
		{
			int j = i + len - 1;

			//枚举分割点
			for (int k = i; k < j; k++)
			{
				if (f[i][k] == f[k + 1][j] && f[i][k] > 0)
					f[i][j] = max(f[i][j], f[i][k] + 1);
			}
			ret = max(ret, f[i][j]);
		}
	}

	//ret的操作:以所有数据没有一次合并作为大保底,有合并,就跟新一下
	cout << ret << endl;

	return 0;
}

OJ题来源:力扣

OJ题名:移除元素

OJ题归属:顺序表练习题

解题算法:快慢双指针

cpp 复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int d1 = 0, d2 = 0;
        while(d1 < nums.size())
        {
            if (nums[d1] != val)
            {
                nums[d2] = nums[d1];
                d2++;
                d1++;
            }
            else
            {
                d1++;//找不相等的值
            }
        }

        return d2;
    }
};

OJ题来源:力扣

OJ题名:删除有序数组中的重复项

OJ题归属:顺序表练习题

解题算法:快慢双指针

cpp 复制代码
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int d1 = 1, d2 = 0;
        while(d1 < nums.size())
        {
            if (nums[d1] == nums[d2])
            {
                d1++;
            }
            else
            {
                d2++;
                nums[d2] = nums[d1];
                d1++;
            }
        }

        return d2 + 1;
    }
};

OJ题来源:力扣

OJ题名:链表的中间结点

OJ题归属:链表练习题

经验总结:固定步数大小,同步走。

解题算法:快慢双指针

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* d1 = head, *d2 = head;
        while(d1 != nullptr && d1->next != nullptr)
        {
            d1 = d1->next->next;
            d2 = d2->next;
        }

        return d2;
    }
};

OJ题来源:力扣

OJ题名:返回倒数第k个节点

OJ题归属:链表练习题

经验总结:先拉开距离差,同步数大小、同步走。

解题算法:快慢双指针

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        ListNode* d1 = head, * d2 = head;
        while(k--)
        {
            d1 = d1->next;
        }

        while(d1 != nullptr)
        {
            d1 = d1->next;
            d2 = d2->next;
        }

        return d2->val;
    }
};

OJ题来源:力扣

OJ题名:移除链表元素

OJ题归属:链表练习题

经验总结:一个遍历、一个记录,遍历到下一个、记录当前的。

解题算法:双指针

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* cur = head, *prev = nullptr;
        while(cur != nullptr)
        {
            if(cur->val != val)
            {
                prev = cur;
                cur = cur->next;
            }
            else
            {
                if (prev == nullptr)
                {
                    head = cur->next;
                    delete cur;
                    cur = head;
                }
                else
                {
                    prev->next = cur->next;
                    delete cur;
                    cur = prev->next;
                }
            }
        }

        return head;
    }
};
相关推荐
kisshyshy13 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
众少成多积小致巨15 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
猿人谷20 小时前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络21 小时前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络1 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4001 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4001 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
LinXunFeng1 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
JieE2122 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2123 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试