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;
    }
};
相关推荐
总有刁民想爱朕ha18 分钟前
Python PyQt5图片批量转MP4视频工具:本地离线免费无水印,完整代码
开发语言·python·qt
宸津-代码粉碎机38 分钟前
FastUtil+AI多Agent实战:Java AI项目性能终极加速方案
java·服务器·开发语言·python·安全·php
_Narcissus_42 分钟前
二分算法笔记及例题
数据结构·c++·笔记·算法·蓝桥杯·查找·二分算法
Hammer_Hans1 小时前
DFT笔记112
笔记
tachibana21 小时前
RAGAS 指标解读
数据库·人工智能·算法·机器学习·架构·大模型·llm
FAREWELL000751 小时前
学习笔记-热更新导航
笔记·学习
Python私教1 小时前
Python 3.15 来了:free-threading 稳定 ABI 能给高并发服务带来什么
开发语言·python
qq_419563091 小时前
ToT 的 BFS/DFS 有个致命缺口:蒙特卡洛树搜索(MCTS)用「随机试错+统计」让大模型想得更深,小模型 + 它竟超过 GPT-4
算法·深度优先·宽度优先
Logintern092 小时前
[Matlab] 遗传算法求解TSP入门
开发语言·matlab
苏子寒2 小时前
Nano-VLLM全代码解析笔记(6)-embed_head和linear
pytorch·笔记·python·机器学习·ai·nlp·vllm