第一题给出一个点坐标和三角形的三个顶点坐标,求点到三角形的最短距离,若点在三角形内则返回0,在三角形外则输出最短距离。
public static float cacluate(float[] point,float[][] triangle){ float distances = 0; float area = triAngleAreas(triangle[0],triangle[1],triangle[2]); float a = triAngleAreas(triangle[0],triangle[1],point); float b = triAngleAreas(triangle[0],triangle[2],point); float c = triAngleAreas(triangle[1],triangle[2],point); if(area == a+b+c){ return 0.0f; }else{ float distances1 = triAngleDistances(triangle[0], triangle[1], point); float distances2 = triAngleDistances(triangle[0], triangle[2], point); float distances3 = triAngleDistances(triangle[1], triangle[2], point); distances = Math.min(distances1, Math.min(distances2, distances3)); } return distances; } private static float triAngleDistances(float[] a, float[] b, float[] point) { float x1 = a[0]; float y1 = a[1]; float x2 = b[0]; float y2 = b[1]; float k = (y2-y1)/(x2-x1); float bb = y1-k*x1; float x0 = point[0]; float y0 = point[1]; return (float) ((k*x0 - y0 +bb)/(Math.sqrt(k*k + 1))); } private static float triAngleAreas(float[] a, float[] b, float[] c) { float x1 = a[0]; float y1 = a[1]; float x2 = b[0]; float y2 = b[1]; float x3 = c[0]; float y3 = c[1]; return Math.abs(x1*y2-x1*y3+x2*y3-x2*y1+x3*y1-x2*y2); }
-
public int compareVersion(String version1, String version2) { String[] nums1 = version1.split("\\."); String[] nums2 = version2.split("\\."); int m = nums1.length; int n = nums2.length; for(int i = 0;i<Math.max(m,n);i++){ int a = i<m ? Integer.valueOf(nums1[i]):0; int b = i<n ? Integer.valueOf(nums2[i]):0; if(a<b){ return -1; }else if(a>b){ return 1; } } return 0; }
搜索二维矩阵
1.第一次二分:从第 0 列中的「所有行」开始找,找到合适的行 row
2.第二次二分:从 row 中「所有列」开始找,找到合适的列 colpublic boolean Find(int target, int [][] array) { int[] row_num = new int[array.length]; for(int i = 0;i<array.length;i++){ row_num[i] = array[i][0]; } int row = left_bound(row_num, target); if(row <0){ return false; } int[] col_num = array[row]; return bound(col_num,target); } public int left_bound(int[] nums,int target){ int left = 0; int right = nums.length-1; while(left <= right){ int mid = (left + right)/2; if(nums[mid] <= target){ left = mid + 1; }else{ right = mid - 1; } } return left - 1; } public boolean bound(int[] nums,int target){ int left = 0; int right = nums.length-1; while(left <= right){ int mid = (left+right)/2; if(nums[mid] < target){ left = mid +1; }else if(nums[mid] >target){ right = mid - 1; }else if(nums[mid] == target){ return true; } } return false; }
4.接雨水
public static long maxWater (int[] arr) { // write code here if(arr.length == 0){ return 0; } int n = arr.length; long result = 0; long[] left_maxs = new long[n]; left_maxs[0] = arr[0]; long[] right_maxs = new long[n]; for(int i = 1;i<n;i++){ left_maxs[i] = Math.max(left_maxs[i-1],arr[i]); } right_maxs[n-1] = arr[n-1]; for(int j = n-2;j>=0;j--){ right_maxs[j] = Math.max(arr[j],right_maxs[j+1]); } for(int i = 1;i<n;i++){ result += Math.min(right_maxs[i],left_maxs[i]) - arr[i]; } return result; }
5.复原 IP 地址
class Solution { List<String> res; public List<String> restoreIpAddresses(String s) { res = new ArrayList<>(); List<String> temp = new ArrayList<>(); dfs(s,temp,0); return res; } public void dfs(String s,List<String> temp,int index){ if(temp.size() >4){ return; } if(temp.size() >= 4 && index != s.length()){ return; } if(temp.size() == 4){ String temps = new String(temp.get(0) + "." + temp.get(1) + "." + temp.get(2) + "." + temp.get(3)); res.add(temps); return; } for(int i = index;i<s.length();i++){ String sub = s.substring(index,i+1); //防止01 if((sub.length() >= 2 && sub.startsWith("0")) || sub.length() >3){ continue; } int te = Integer.parseInt(sub); if(te <0 || te >=256){ continue; } temp.add(sub); dfs(s,temp,i+1); temp.remove(temp.size()-1); } } }