算法题笔记

阅读(13)
评论(0)
Beginning

数组

常用STL和遍历#

//1.常用STL
nums.size();//返回数组元素数量
nums.begin();
nums.end();
sort(A.begin(), A.end()); // 快速排序
    
//2.遍历
int size = nums.size();
for(int i = 0; i < size; i++){}

二分查找#

int left = 0;
int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
    int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
    if (nums[middle] > target) {
        right = middle - 1; // target 在左区间,所以[left, middle - 1]
    } else if (nums[middle] < target) {
        left = middle + 1; // target 在右区间,所以[middle + 1, right]
    } else { // nums[middle] == target
        return middle; // 数组中找到目标值,直接返回下标
    }

双指针#

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

滑动窗口#

while (sum >= s) {
    subLength = (j - i + 1); // 取子序列的长度
    result = result < subLength ? result : subLength;
    sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
}

链表

定义与初始化#

//1.单链表定义
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

//2.初始化节点(常用于初始化虚拟节点)
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;

删除节点#

//3.删除节点
ListNode* tmp = head;
head = head->next;
delete tmp;//C++需要手动删除内存
Ending

作者:filosefer

出处:https://www.cnblogs.com/filosefer/p/17679259.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   一半白一半蓝  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
more_horiz
keyboard_arrow_up dark_mode
选择主题
menu
点击右上角即可分享
微信分享提示