当前位置: 首页 > article >正文

9. 日常算法

1. 相交链表

题目来源

方法一:暴力枚举

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int l1 = 0, l2 = 0;
        ListNode* cur1 = headA, * cur2 = headB;
        // 计算两个长度
        while (cur1 || cur2){
            if (cur1){
                l1++;
                cur1 = cur1->next;
            }
            if (cur2){
                l2++;
                cur2 = cur2->next;
            }
        }
        int l3 = l1 > l2 ? l1 - l2 : l2 - l1;
        ListNode *longer = headA, *shorter = headB;
        if (l2 > l1){
            longer = headB;
            shorter = headA;
        }
        // 让长的先走差值步数
        for (int i = 0; i < l3; i++) longer = longer->next;
        while (longer != shorter){
            longer = longer->next;
            shorter = shorter->next;
        }
        return shorter;
    }
};

方法二:哈希

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        unordered_set<ListNode*> exist;
        ListNode* cur = headA;
        while (cur){
            exist.insert(cur);
            cur = cur->next;
        }
        cur = headB;
        while (cur){
            if (exist.count(cur)){
                return cur;
            }
            cur = cur->next;
        }
        return nullptr;
    }
};

方法三:双指针

实现原理是:

  • pa指向headA的头结点,pb指向headB的头结点
  • 如果pa指向了nullptr则将其指向headB的头结点,如果pb指向了nullptr则将pb指向headA的头结点
  • 假设headA和headB没有相交的节点长度为a和b,相交部分长度为c
  • 这样pa做过的路长就是 a + c + b,而pb走过的长度是 b + c + a,所以最终是会走到同一个地方的。
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *pa = headA, *pb = headB;
        while (pa != pb){
            pa = pa == nullptr ? headB : pa->next;
            pb = pb == nullptr ? headA : pb->next;
        }
        return pa;
    }
};

2. LCR 121. 寻找目标值 - 二维数组

题目来源
m*n 的二维数组 plants 记录了园林景观的植物排布情况,具有以下特性:
每行中,每棵植物的右侧相邻植物不矮于该植物;
每列中,每棵植物的下侧相邻植物不矮于该植物。

请判断 plants 中是否存在目标高度值 target。

示例 1:
输入:plants = [[2,3,6,8],[4,5,8,9],[5,9,10,12]], target = 8
输出:true

方法就是从右上角或者左下角作为起点,这样换个角度就是一个搜索二叉树,左边比根小,右边比根大。

// 递归
class Solution {
public:
    bool check(vector < vector<int>> & plants, int x, int y) {
        return (x < plants.size() && y >= 0);
    }
    bool dfs(vector < vector<int>> & plants, int x, int y, int target) {
        if (!check(plants, x, y)) return false;
        if (plants[x][y] < target){
            if (dfs(plants, x + 1, y, target)) return true;
        }else if (plants[x][y] > target){
            if (dfs(plants, x, y - 1, target)) return true;
        }else{
            return true;
        }
        return false;
    }
    bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {
        if (plants.size() == 0 || plants[0].size() == 0)
            return 0;
            // 从右上角开始,左边比plants[x][y]小,下面比plants[x][y]大;
        return dfs(plants, 0, plants[0].size() - 1, target);
    }
};
//循环
class Solution {
public:
    bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {
        if (plants.size() == 0 || plants[0].size() == 0) return 0; 
        int i = 0, j = plants[0].size() - 1;
        while (j >= 0 && i < plants.size()){
            if (plants[i][j] > target) j--;
            else if (plants[i][j] < target) i++;
            else return true;
        }
        return false;
    }
};

http://www.kler.cn/a/449381.html

相关文章:

  • 视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点
  • 重温设计模式--中介者模式
  • Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
  • docker 容器的基本使用
  • 单元测试mock框架Mockito
  • 【JAVA】JAVA接口公共返回体ResponseData封装
  • SAP SD客户主数据及其配置
  • vue前端实现同步发送请求【已封装】
  • 【唐叔学算法】第17天:排序算法之插入排序
  • GPU环境配置
  • 华为OD --- TLV解码
  • Go怎么做性能优化工具篇之基准测试
  • 芝法酱学习笔记(2.2)——sql性能优化2
  • 0.96寸OLED显示屏详解
  • Day1 苍穹外卖前端 Vue基础、Vue基本使用方式、Vue-router、Vuex、TypeScript
  • Python实现将series系列数据格式批量转换为Excel
  • OCR(五)linux 环境 基于c++的 paddle ocr 编译【CPU版本 】
  • 高原地区无人机巡检作业技术详解
  • 螺栓连接|结构强度与刚度评定
  • C++练习题之计算天数
  • SpringBoot3-第二篇(Web开发)
  • 使用FreeNAS软件部署ISCSI的SAN架构存储(IP-SAN)练习题
  • 物联网水文观测设备
  • 蓝桥杯物联网开发板硬件组成
  • 汽车IVI中控开发入门及进阶(41):视频播放器MPlayer
  • 单片机的内存是指RAM还是ROM