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

东莞网站系统后缀网站备案系统验证码出错的解决方案

东莞网站系统后缀,网站备案系统验证码出错的解决方案,网站的排名就是友情链接,网站的搭建流程文章目录 149. 直线上最多的点数题目链接标签思路总体思路如何判断 一个点 在 由两点确定的直线 上 代码 347. 前 K 个高频元素题目链接标签思路代码 31. 下一个排列题目链接标签思路代码 149. 直线上最多的点数 题目链接 149. 直线上最多的点数 标签 几何 数组 哈希表 数学…

文章目录

  • 149. 直线上最多的点数
    • 题目链接
    • 标签
    • 思路
      • 总体思路
      • 如何判断 一个点 在 由两点确定的直线 上
    • 代码
  • 347. 前 K 个高频元素
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 31. 下一个排列
    • 题目链接
    • 标签
    • 思路
    • 代码


149. 直线上最多的点数

题目链接

149. 直线上最多的点数

标签

几何 数组 哈希表 数学

思路

总体思路

本题是一道 数学题,可以采取 暴力 的方式:

  • 枚举所有由两点连接而成的直线,即 枚举任意两个点 计算其所在直线。
  • 然后再 枚举所有点,统计 每条直线上的点的数量 的最大值。

可以稍微对这种方式进行优化:

  • 将第一步中的 枚举任意两个点 改为 枚举 任意点 和 其之后的所有点。防止 计算完点 A A A 和点 B B B 所在直线上的点的数量之后,再计算点 B B B 和点 A A A 所在直线上的点的数量 这样的重复计算。
  • 将第二步中的 枚举所有点 改为 枚举 第一步枚举的两个点之后的 所有点。避免了重复计算。

如何判断 一个点 在 由两点确定的直线 上

接下来就需要考虑如何判断一个点 在 由两点确定的直线 上,其实并不难,既然已经枚举出两个点 P 1 ( x 1 , y 1 ) , P 2 ( x 2 , y 2 ) P_1(x_1, y_1), P_2(x_2, y_2) P1(x1,y1),P2(x2,y2),对于第三个点 P 3 ( x 3 , y 3 ) P_3(x_3, y_3) P3(x3,y3),只要 第一个点 和 第二个点 所确定直线的斜率 与 第二个点 和 第三个点 所确定直线的斜率 相同,则点 P 3 P_3 P3 在直线 P 1 P 2 P_1P_2 P1P2 上。斜率相同可以表示如下:
x 1 − x 2 y 1 − y 2 = x 2 − x 3 y 2 − y 3 \frac{x_1 - x_2}{y_1 - y_2} = \frac{x_2 - x_3}{y_2 - y_3} y1y2x1x2=y2y3x2x3
但是,在程序中无法使用 int, double 表示分数,如果强行使用,则会造成一定的精度损失,导致结果错误。所以考虑 将 除法 变成 乘法,斜率相同表示如下:
( y 2 − y 3 ) ( x 1 − x 2 ) = ( x 2 − x 3 ) ( y 1 − y 2 ) (y_2 - y_3) (x_1 - x_2) = (x_2 - x_3) (y_1 - y_2) (y2y3)(x1x2)=(x2x3)(y1y2)
确定第三个点是否在直线上时,需要多次使用 ( x 1 − x 2 ) (x_1 - x_2) (x1x2) ( y 1 − y 2 ) (y_1 - y_2) (y1y2),所以用变量来记录它们: Δ x = ( x 1 − x 2 ) , Δ y = ( y 1 − y 2 ) \Delta x = (x_1 - x_2), \Delta y = (y_1 - y_2) Δx=(x1x2),Δy=(y1y2),斜率相同表示如下:
( y 2 − y 3 ) Δ x = ( x 2 − x 3 ) Δ y (y_2 - y_3) \Delta x = (x_2 - x_3) \Delta y (y2y3)Δx=(x2x3)Δy

代码

class Solution {public int maxPoints(int[][] points) {int n = points.length; // 获取数组中点的数量if (n <= 2) { // 如果点的数量小于等于 2return n; // 则直接返回点的数量即可}int res = 0; // 保存结果for (int i = 0; i < n; i++) {int[] p1 = points[i]; // 第一个点for (int j = i + 1; j < n; j++) {int[] p2 = points[j]; // 第二个点int deltaX = p1[0] - p2[0]; // p1 和 p2 的横坐标的差值int deltaY = p1[1] - p2[1]; // p1 和 p2 的纵坐标的差值// 统计有多少个点位于 p1 与 p2 所确定的直线上,初始值为 2 表示 p1 和 p2 位于这条直线上int cnt = 2;for (int k = j + 1; k < n; k++) {int[] p3 = points[k]; // 第三个点// 如果 p3 在 p1, p2 所确定的直线上,则点数加一if ((p3[1] - p2[1]) * deltaX == (p3[0] - p2[0]) * deltaY) {cnt++;}}res = Math.max(res, cnt); // 更新最大值}}return res;}
}

347. 前 K 个高频元素

题目链接

347. 前 K 个高频元素

标签

数组 哈希表 分治 桶排序 计数 快速选择 排序 堆(优先队列)

思路

本题可以使用 优先队列,和 LeetCode 215. 数组中的第K个最大元素 很相似,都使用 小顶堆 来存放数组中优先级前 K 高的元素,不过本题中元素的优先级不是元素的值,而是元素的出现次数。

本题直接使用 Java 中的 PriorityQueue 优先队列,(用一个长度为 2 的数组作为类型参数)保存元素的值和出现次数。此外,需要在构造器中传入一个 比较器,定义优先队列内部存储的数据如何进行比较。

代码

class Solution {public int[] topKFrequent(int[] nums, int k) {// 统计每个元素出现的次数,key 为元素的值,value 为元素出现的次数Map<Integer, Integer> cnt = new HashMap<>(nums.length);for (int num : nums) {cnt.put(num, cnt.getOrDefault(num, 0) + 1);}// 小顶堆,元素出现的次数越少,越靠近顶部。存放着数组中频率前 k 高的元素// 在 int[] 中存放了 2 个值,第一个值表示 元素的值,第二个值表示 元素出现的次数PriorityQueue<int[]> pq = new PriorityQueue<>((p1, p2) -> p1[1] - p2[1]);for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) { // 构建小顶堆int num = entry.getKey(), count = entry.getValue();if (pq.size() < k) { // 如果小顶堆中的元素少于 k 个pq.offer(new int[]{num, count}); // 则给其中添加元素} else if (count > pq.peek()[1]) {// 此时元素个数等于 k 个,如果 当前元素的出现次数 大于 堆顶元素的出现次数pq.poll(); // 则移除堆顶元素pq.offer(new int[]{num, count}); // 将当前元素放入堆中}}// 构造结果数组并返回int[] res = new int[k];for (int i = 0; i < k; i++) {res[i] = pq.poll()[0];}return res;}
}

31. 下一个排列

题目链接

31. 下一个排列

标签

数组 双指针

思路

本题是 纯技巧题,只要会这个技巧便能解决本题,如果不会,最好将其 下来。这个技巧分为如下三步:

  1. 寻找
    • 在数组中,从右向左寻找 小于它右边的数 的数,将其称为 逆数。例如 [1, 2, 5, 4, 6, 3] 中的 4
    • 如果在数组中找到了 逆数,那么从 最后一个数 到 逆数 的下一个数,寻找一个 比 逆数 大 的数,将其称为 大数。例如 [1, 2, 5, 4, 6, 3] 中的 6
  2. 交换:如果能找到 大数,则交换这两个数。
  3. 反转
    • 如果在数组中找到了 逆数,则将 逆数 的下一个数 到 最后一个数 的范围内的所有数进行反转操作。
    • 如果在数组中没有找到 逆数,则将整个数组都进行反转操作。

如果很难理解这个技巧,不妨来看看这个例子,至少知道它可以使用:

对于数组 [1, 2, 5, 4, 6, 3]
-----------------------------------
寻找逆数和比逆数大的数,分别用 i, j 指向:
[1, 2, 5, 4, 6, 3]^  ^i  j
-----------------------------------
交换 i, j 指向的数:
[1, 2, 5, 6, 4, 3]^i
-----------------------------------
反转 i + 1 之后的部分:
[1, 2, 5, 6, 3, 4]

代码

class Solution {public void nextPermutation(int[] nums) {final int n = nums.length;// 从右往左扫描,直到找到一个 比它右边的数小的 数int i = n - 2;while (i >= 0 && nums[i] >= nums[i + 1]) {i--;}// 如果在数组中找到了逆数if (i >= 0) {// 则 在 索引为 i + 1 的数 到 最后一个数 的范围内,寻找一个比逆数大的数int j = n - 1;while (j > i && nums[i] >= nums[j]) {j--;}// 交换它们swap(nums, i, j);}// 反转 i + 1 之后的部分reverse(nums, i + 1);}// 交换 nums 中索引 i, j 指向的元素private void swap(int[] nums, int i, int j) {int temp  = nums[i];nums[i] = nums[j];nums[j] = temp;}// 从 start 开始反转 nums 数组private void reverse(int[] nums, int start) {int left = start, right = nums.length - 1;while (left < right) {swap(nums, left, right);left++;right--;}}
}
http://www.yayakq.cn/news/942672/

相关文章:

  • 网站每年续费费用网站开发语言包括哪些
  • 国内适合个人做外贸的网站有哪些铜仁市建设招投标网站
  • wordpress怎么禁用多域名泉州关键词优化排名
  • 做古风文字头像的网站医疗网站是否全部需要前置备案
  • 长春建站公司网站上海电子商城网站
  • 网站建设国内现状免费个人网站建站申请流程
  • 纵横网站建立wordpress文章列表多图展示
  • 卖网站怎样做网创项目资源网站
  • 棋盘游戏类网站开发为什么百度不收录wordpress
  • 四川建设质量安全网站浏览器怎么打开网站服务器下载
  • 鞍山网站建设找金航禅城区网站建站网站
  • 小榄网站建设建设外贸公司网站
  • 怎么投诉网站制作公司银川网站建设那家好
  • 微网站免费建站系统wordpress 4.4.9 漏洞
  • 兰州优化网站公司做网站推广怎么跟客户沟通
  • 做兼职设计去哪个网站好外贸出口工艺品怎么做外贸网站
  • 如何在中国建设银行网站转账河北怀来县建设局网站
  • 包头手机网站制作大气有内涵的公司名字
  • 做网站哪家强网上做调查问卷赚钱的网站
  • 无锡网站建设书生商友网页实时翻译器
  • 网站建设有哪些名词手机上如何建立wordpress
  • 网站建设管理情况自查报告怎么给网站做手机端
  • 建设网站需要哪些元素wordpress js代码放哪
  • 邢台兼职网站有哪些?小广告发布
  • 邢台提供网站设计公司哪家专业网站备案需要审核多久
  • 网站标题 逗号网页设计代码浮动效果
  • 做网站价格报价费用多少钱国外私人网站
  • 深圳建设品牌网站全球优秀网页设计机构
  • 青岛网站制作排名贵阳做网站电话
  • 珠海建站前端是做什么的?