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;
    }
};
相关推荐
漂流瓶jz37 分钟前
UVA-1613 K度图的着色 题解答案代码 算法竞赛入门经典第二版
算法·深度优先·图论·贪心·aoapc·算法竞赛入门经典·uva
Pniubi1 小时前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划
吴长建先生重名了2 小时前
GitHub Actions部署报表系统踩坑记:幂等性与限
算法
贝壳6903 小时前
一个2026年2月才上传的库,凭什么敢碰2009年就有人写烂的题目
算法
贝壳6903 小时前
同一道三亿位选型题,三个AI给了我三个答案,我把它们拉进同一台机器复跑
算法
starzy19904 小时前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
Go Work4 小时前
docker 占满根分区时先分清谁在吃盘
经验分享·笔记
布莱克6054 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
汉克老师5 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
吴可可1235 小时前
ActiveX调用WScript.Shell原理揭秘
开发语言