[leetcode 周赛 159] 1232 缀点成线

1232 Check If It Is a Straight Line 缀点成线

问题描述

在一个?XY 坐标系中有一些点,我们用数组?coordinates?来分别记录它们的坐标,其中?coordinates[i] = [x, y]?表示横坐标为 x、纵坐标为 y?的点。

请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true,否则请返回 false

示例 1:

输入: coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]
输出: true

示例 2:

输入: coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]]
输出: false

提示:

  • 2 <=?coordinates.length <= 1000
  • coordinates[i].length == 2
  • -10^4 <=?coordinates[i][0],?coordinates[i][1] <= 10^4
  • coordinates?中不含重复的点

思路

  • 读题
    连点成线, 一条线上的点有什么特点? 斜率相等

暴力法 因为点不多(1000以内)

枚举这条线的状态: 斜的/平的/竖的

  • 平的: y值相等
  • 竖的: x值相等
  • 斜的: 斜率(y1-y2)/(x1-x2)相等

公式法 y=kx+b

通过两个点, 确定k, b的值, 建立直线公式y=kx+b
将剩余点逐一代入公式

代码实现

暴力法

class Solution {
    public boolean checkStraightLine(int[][] coordinates) {
        int len = coordinates.length;

        // x轴是否相等
        int linex = coordinates[0][0];
        boolean yes = true;
        for (int i = 1; i < len; i++) {
            if (coordinates[i][0] != linex) {
                yes = false;
                break;
            }
        }
        // 如果x值全相等 竖线
        if (yes) return true;

        // y轴是否相等
        int liney = coordinates[0][1];
        yes = true;
        for (int i = 1; i < len; i++) {
            if (coordinates[i][1] != liney) {
                yes = false;
                break;
            }
        }
        // 如果y值全相等 横线
        if (yes) return true;

        // 斜线
        int dx = coordinates[1][0]-coordinates[0][0], x1 = coordinates[0][0];
        int dy = coordinates[1][1]-coordinates[0][1], y1 = coordinates[0][1];
        if (dx == 0 || dy == 0) {
            return false;
        }
        // 初始斜率
        double dxy = dx/dy;
        for (int i = 2; i < len; i++) {
            int curx = coordinates[i][0], cury = coordinates[i][1];
            // 因为不可能出现斜率为0(竖线/横线)
            if ((curx-x1) == 0 || (cury-y1) == 0) {
                return false;
            }
            // 当前点斜率
            double dcp = (curx-x1)/(cury-y1);
            if (dxy == dcp) {
                continue;
            }
            return false;
        }

        return true;
    }
}

公式法

class Solution {
    public boolean checkStraightLine(int[][] coordinates) {
        int len = coordinates.length;
        // 两点必定一线
        if (len <= 2) {
            return true;
        }

        int x1 = coordinates[0][0], y1 = coordinates[0][1];
        int x2 = coordinates[1][0], y2 = coordinates[1][1];

        // y = kx+b --> k = (y1-y2)/(x1-x2)  b = y-kx
        int k, b;
        if (x1 == x2) {
            k = 0;
        } else {
            k = (y1-y2)/(x1-x2);
        }
        b = y1 - k*x1;

        for (int i = 3; i < len; i++) {
            int y = coordinates[i][1], x = coordinates[i][0];
            if (y != k*x + b) {
                return false;
            }
        }

        return true;
    }
}

参考资源

第 159 场力扣周赛 讨论区

原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11779111.html

时间: 2024-11-07 10:33:05

[leetcode 周赛 159] 1232 缀点成线的相关文章

[leetcode 周赛 159] 1233 删除子文件夹

1233 Remove Sub-Folders from the Filesystem 删除子文件夹 问题描述 你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹. 我们这样定义「子文件夹」: 如果文件夹?folder[i]?位于另一个文件夹?folder[j]?下,那么?folder[i]?就是?folder[j]?的子文件夹. 文件夹的「路径」是由一个或多个按以下格式串联形成的字符串: /?后跟一个或者多个小写英

[leetcode 周赛 159] 1234 替换子串等到平衡字符串

1234 Replace the Substring for Balanced String 替换子串等到平衡字符串 问题描述 有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串. 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」. 给你一个这样的字符串 s,请通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」. 你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换. 请返回待替换子串的最小可能长度. 如

[leetcode 周赛 159] 1235 规划兼职工作

1235 Maximum Profit in Job Scheduling 规划兼职工作 问题描述 你打算利用空闲时间来做兼职工作赚些零花钱. 这里有?n?份兼职工作,每份工作预计从?startTime[i]?开始到?endTime[i]?结束,报酬为?profit[i]. 给你一份兼职工作表,包含开始时间?startTime,结束时间?endTime?和预计报酬?profit?三个数组,请你计算并返回可以获得的最大报酬. 注意,时间上出现重叠的 2 份工作不能同时进行. 如果你选择的工作在时间

Leetcode:Swap Nodes in Pairs 链表成对交换节点

Swap Nodes in Pairs: Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify the va

将图片转成线稿图

1.首先找一张图片,在PS中打开,我随便找了一张自己收藏的壁纸如下图: 2.打开图片之后, 我们先把图像处理成黑白.点击菜单栏:图像-调整-黑白. 快捷键:Alt+Shitf+Ctrl+B 3.现在我们把这个图层复制一个.点击菜单栏:图层-复制图层-确定. .快捷键:Ctrl+J 大家可以看左下角的图层面板. 4.对复制出来的图层执行"反向"处理.点击菜单栏: 图像 - 调整 - 反向.. 快捷键:Ctrl+I 这样就类似与底片的效果了. 5.再接着, 修改已经反向的图层的图层属性, 

leetcode-159周赛-5230-缀点成线

自己的提交: class Solution: def checkStraightLine(self, coordinates: List[List[int]]) -> bool: if not coordinates: return False if len(coordinates) <= 2: return True k = float("inf") if coordinates[1][0] - coordinates[0][0] == 0 else (coordinat

【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)

Contest 81 (2018年11月8日,周四,凌晨) 链接:https://leetcode.com/contest/weekly-contest-81 比赛情况记录:结果:3/4, ranking: 440/2797.这次题目似乎比较简单,因为我比赛的时候前三题全做出来了(1:12:39),然后第四题有思路,正在写,没写完,比赛完了写完提交也对了. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [821]

【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)

Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653-656) 链接:https://leetcode.com/contest/leetcode-weekly-contest-44 比赛情况记录:就做出来两题,第三题不难,然而就是在算坐标的时候卡住了.orz.结果:2/4,ranking:637/2272.第四题没看题,第三题搞得心情不好了orz. [653]Two Sum

[leetcode 周赛 157] 1217 玩筹码

1217 Play With Chips 玩筹码 题目描述 数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中. 你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以): 将第 i 个筹码向左或者右移动 2 个单位,代价为 0. 将第 i 个筹码向左或者右移动 1 个单位,代价为 1. 最开始的时候,同一位置上也可能放着两个或者更多的筹码. 返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价. 示例 1: 输入:chips = [1,2,3] 输出:1 解释: