1037. 有效的回旋镖 & 92. 反转链表 II

96 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

前言

Hello!

非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~  

自我介绍 ଘ(੭ˊᵕˋ)੭

昵称:海轰

标签:程序猿|C++选手|学生

简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研。

学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!  

唯有努力💪  

知其然 知其所以然!

本文只记录感兴趣的部分

每日一题

题目

给定一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。

回旋镖 定义为一组三个点,这些点 各不相同 且 不在一条直线上 。

 

示例 1:

输入:points = [[1,1],[2,3],[3,2]]

输出:true

示例 2:

输入:points = [[1,1],[2,2],[3,3]]

输出:false  

提示:

  • points.length == 3
  • points[i].length == 2
  • 0 <= xi, yi <= 100

解答

题目挺简单的

判断三点是否共线

利用两条直线的斜率即可(用乘积形式)

class Solution {
public:
    bool isBoomerang(vector<vector<int>>& points) {
        return !((points[1][1] - points[0][1]) * (points[2][0] - points[0][0]) == (points[2][1] - points[0][1]) * (points[1][0] - points[0][0]));
    }
};

题目

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。  

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4

输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1

输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

解答

/**
 * 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:
    void reverseListNode(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while(cur) {
            ListNode* nextNode = cur->next;
            cur->next = pre;
            pre = cur;
            cur = nextNode;
        }
    }
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode* dummyNode = new ListNode(-1);
        dummyNode->next = head;

        ListNode* pre = dummyNode;
        for(int i = 0; i < left - 1; ++i) {
            pre = pre->next;
        }
        ListNode* rightNode = pre;
        for(int i = 0; i < right - left + 1; ++i) {
            rightNode = rightNode->next;
        }
        ListNode* leftNode = pre->next;
        ListNode* last = rightNode->next;

        pre->next = nullptr;
        rightNode->next = nullptr;

        reverseListNode(leftNode);

        // 注意此时 pre后面为rightNode last之前为leftNode
        pre->next = rightNode;
        leftNode->next = last;

        return dummyNode->next;
    }
};

借助206题的反转链表

先找出需要反转的链表

断开连接

再反转

再拼接上即可

链表问题需注意细节!

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述