最近发现自己的编程能力真是太差了,记录leetcode专栏也是为了从点滴做起。避免眼高手低。
leetcode - 812. 最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
示例:
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释:
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。
注意:
3 <= points.length <= 50
.- 不存在重复的点。
-
-50 <= points[i][j] <= 50
. - 结果误差值在
10^-6
以内都认为是正确答案。
这道题乍一看都感觉是AC不了的(因为基本上算法题都会对算法效率有一些要求?),自己其实根本没有系统的学习过算法,近期开始从头开始看算法相关推荐书籍了,扫一下盲。(用三边计算三角形面积的公式百度找的。。。)
做了这道题唯一的收获就是要仔细审题吧,题目说明输入至多50个点,数值也只在 -50~50之间。50 x 50 x 50的计算量应该还挺小的吧。。。尝试了一下暴力破解法,结果通过了(这道题leetcode标记为简单)。
平时工作也是,遇到问题首先要了解问题的范围,才能找到相应的解决办法。杀猪用宰牛刀就得不偿失了
我的解法:
class Solution {
public double largestTriangleArea(int[][] points) {
double max = 0;
points = new int[][]
{{0, 0}, {0, 1}, {1, 0}, {0, 2}, {2, 0}}
;
for (int i = 0; i < points.length; i++) {
for (int j = 0; j < points.length; j++) {
for (int k = 0; k < points.length; k++) {
if (i == j || i == k || j == k) {
continue;
}
double a = getEdge(points[i][0], points[i][1], points[j][0], points[j][1]);// ij
double b = getEdge(points[j][0], points[j][1], points[k][0], points[k][1]);// jk
double c = getEdge(points[i][0], points[i][1], points[k][0], points[k][1]);// ik
double s = (1 / 4.0) * Math.sqrt((a + b + c) * (a + b - c) * (a + c - b) * (b + c - a));
if (max < s) {
max = s;
}
}
}
}
return max;
}
private double getEdge(int x1, int y1, int x2, int y2) {
return Math.sqrt(Math.pow(y2 - y1, 2) + Math.pow(x2 - x1, 2));
}
}
菜的一B_1:
上面的代码57个用例,60ms。AC后看了看用时最短的代码(10ms),真的是被自己蠢哭了,当时还在想下面的三层for循环是不是不能遍历所有的组合。。。。
String[] chars = new String[]{"a", "b", "c","d"};
for (int i = 0; i < chars.length; i++) {
for (int j = i + 1; j < chars.length; j++) {
for (int k = j + 1; k < chars.length; k++) {
System.out.println(chars[i] + chars[j] + chars[k]);
}
}
}
其实很简单的问题,需要细心,需要耐心。发现自己很多时候思路还没有走完整个计算流程,中途就中断思考了,缺的是耐心。
菜的一B_2:
int[][] points = new int[2][3];
points.length我居然在犹豫到底等于2还是等于6.....基础太差,需要系统的看一遍Java。