日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员面试金典 - 面试题 16.13. 平分正方形(数学)

發(fā)布時間:2024/7/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试金典 - 面试题 16.13. 平分正方形(数学) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 題目

給定兩個正方形及一個二維平面。請找出將這兩個正方形分割成兩半的一條直線。
假設(shè)正方形頂邊和底邊與 x 軸平行。

每個正方形的數(shù)據(jù)square包含3個數(shù)值,正方形的左下頂點坐標(biāo)[X,Y] = [square[0],square[1]],以及正方形的邊長square[2]。
所求直線穿過兩個正方形會形成4個交點,請返回4個交點形成線段的兩端點坐標(biāo)(兩個端點即為4個交點中距離最遠(yuǎn)的2個點,這2個點所連成的線段一定會穿過另外2個交點)。
2個端點坐標(biāo)[X1,Y1]和[X2,Y2]的返回格式為{X1,Y1,X2,Y2},要求若X1 != X2,需保證X1 < X2,否則需保證Y1 <= Y2。

若同時有多條直線滿足要求,則選擇斜率最大的一條計算并返回(與Y軸平行的直線視為斜率無窮大)。

示例: 輸入: square1 = {-1, -1, 2} square2 = {0, -1, 2} 輸出: {-1,0,2,0} 解釋: 直線 y = 0 能將兩個正方形同時分為等面積的兩部分,返回的兩線段端點為[-1,0][2,0]提示: square.length == 3 square[2] > 0

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/bisect-squares-lcci
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

2. 解題

  • 過兩個正方形中心的直線
  • 分成斜率無窮大(垂直于x軸)、斜率絕對值>=1、< 1 考慮
  • 交點在上下邊,還是在左右邊
class Solution { public:vector<double> cutSquares(vector<int>& square1, vector<int>& square2) {if(square1[1] > square2[1])swap(square1,square2);//第一個的左下角y坐標(biāo)更小double cx1, cy1, cx2, cy2, r1, r2;r1 = square1[2]/2.0;r2 = square2[2]/2.0;cx1 = square1[0]+r1;//中心坐標(biāo)cy1 = square1[1]+r1;cx2 = square2[0]+r2;cy2 = square2[1]+r2;if(cx1==cx2)//斜率無窮大return {cx1,cy1-r1,cx1,max(cy1+r1,cy2+r2)};else//斜率存在,分兩種情況,與上下邊相交,左右邊相交{double k = (cy1-cy2)/(cx1-cx2);double b = cy1-k*cx1;vector<vector<double>> points;if(abs(k)>=1)//交點在上下邊{points.push_back({(cy1+r1-b)/k, cy1+r1});points.push_back({(cy1-r1-b)/k, cy1-r1});points.push_back({(cy2+r2-b)/k, cy2+r2});points.push_back({(cy2-r2-b)/k, cy2-r2});sort(points.begin(),points.end());return {points.front()[0],points.front()[1],points.back()[0],points.back()[1]};}else//交點在左右邊{points.push_back({cx1+r1, k*(cx1+r1)+b});points.push_back({cx1-r1, k*(cx1-r1)+b});points.push_back({cx2+r2, k*(cx2+r2)+b});points.push_back({cx2-r2, k*(cx2-r2)+b});sort(points.begin(),points.end());return {points.front()[0],points.front()[1],points.back()[0],points.back()[1]};}}} };

4 ms 8.6 MB

總結(jié)

以上是生活随笔為你收集整理的程序员面试金典 - 面试题 16.13. 平分正方形(数学)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。