国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

?LeetCode解法匯總874. 模擬行走機(jī)器人

這篇具有很好參考價值的文章主要介紹了?LeetCode解法匯總874. 模擬行走機(jī)器人。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄鏈接:

力扣編程題-解法匯總_分享+記錄-CSDN博客

GitHub同步刷題項目:

https://github.com/September26/java-algorithms

原題鏈接:力扣

描述:

機(jī)器人在一個無限大小的 XY 網(wǎng)格平面上行走,從點(diǎn)?(0, 0)?處開始出發(fā),面向北方。該機(jī)器人可以接收以下三種類型的命令?commands?:

  • -2?:向左轉(zhuǎn)?90?度
  • -1?:向右轉(zhuǎn)?90?度
  • 1 <= x <= 9?:向前移動?x?個單位長度

在網(wǎng)格上有一些格子被視為障礙物?obstacles?。第?i?個障礙物位于網(wǎng)格點(diǎn) ?obstacles[i] = (xi, yi)?。

機(jī)器人無法走到障礙物上,它將會停留在障礙物的前一個網(wǎng)格方塊上,但仍然可以繼續(xù)嘗試進(jìn)行該路線的其余部分。

返回從原點(diǎn)到機(jī)器人所有經(jīng)過的路徑點(diǎn)(坐標(biāo)為整數(shù))的最大歐式距離的平方。(即,如果距離為?5?,則返回?25?)

注意:

  • 北表示?+Y?方向。
  • 東表示?+X?方向。
  • 南表示?-Y?方向。
  • 西表示?-X?方向。

示例 1:

輸入:commands = [4,-1,3], obstacles = []
輸出:25
解釋:
機(jī)器人開始位于 (0, 0):
1. 向北移動 4 個單位,到達(dá) (0, 4)
2. 右轉(zhuǎn)
3. 向東移動 3 個單位,到達(dá) (3, 4)
距離原點(diǎn)最遠(yuǎn)的是 (3, 4) ,距離為 32 + 42 = 25

示例?2:

輸入:commands = [4,-1,4,-2,4], obstacles = [[2,4]]
輸出:65
解釋:機(jī)器人開始位于 (0, 0):
1. 向北移動 4 個單位,到達(dá) (0, 4)
2. 右轉(zhuǎn)
3. 向東移動 1 個單位,然后被位于 (2, 4) 的障礙物阻擋,機(jī)器人停在 (1, 4)
4. 左轉(zhuǎn)
5. 向北走 4 個單位,到達(dá) (1, 8)
距離原點(diǎn)最遠(yuǎn)的是 (1, 8) ,距離為 12 + 82 = 65

提示:

  • 1 <= commands.length <= 104
  • commands[i]?is one of the values in the list?[-2,-1,1,2,3,4,5,6,7,8,9].
  • 0 <= obstacles.length <= 104
  • -3 * 104 <= xi, yi <= 3 * 104
  • 答案保證小于?231

解題思路:

* 874. 模擬行走機(jī)器人

* -2:左轉(zhuǎn)90

* -1:右轉(zhuǎn)90

* 1<=x<=9,移動長度

* 解題思路:

* 首先我們看范圍,1 <= commands.length <= 10^4,0 <= obstacles.length <= 10^4。

* 則肯定不能是n*m的復(fù)雜度,否則時間會超過。

* 但是commands的遍歷肯定是要的,所以我們就想辦法解決obstacles,把其變?yōu)橐粋€O(1)或者O(lgn)復(fù)雜度的查詢。

* obstacles按照x軸和y軸分為兩個map,key為x或者y坐標(biāo),value為這個坐標(biāo)軸上所有的點(diǎn),然后進(jìn)行排序。

* 遍歷commands的時候,方向自然不用說,如果遇到了前進(jìn)或者后退,則判斷當(dāng)前軸距離原點(diǎn)最近的點(diǎn)長度,如果大于command則移動command,否則移動最近長度。文章來源地址http://www.zghlxwxcb.cn/news/detail-666804.html

代碼:

class Solution874
{
public:
    /**
     * 找出比tartget找到有序集合中,比目標(biāo)值相等或者大的
     * 或者
     * 找到有序集合中,比目標(biāo)值相等或者小的
     */
    int findIndex(vector<int> *list, int target, bool isBigger)
    {
        int left = 0;
        int right = list->size() - 1;
        int middle;
        int abs = isBigger ? right + 1 : left - 1;
        while (left <= right)
        {
            middle = (left + right) / 2;
            if (isBigger)
            {
                if ((*list)[middle] > target)
                {
                    right = middle - 1;
                    abs = middle;
                }
                else
                {
                    left = middle + 1;
                }
            }
            else
            {
                if ((*list)[middle] < target)
                {
                    abs = middle;
                    left = middle + 1;
                }
                else
                {
                    right = middle - 1;
                }
            }
        }
        return abs;
    }

    /**
     * forward 方向,加或者減
     * value   前進(jìn)值
     * from    起始值
     */
    void takeStep(map<int, vector<int>> &xMap, map<int, vector<int>> &yMap, int &x, int &y, int forward, int step)
    {

        vector<int> *list;
        int from = 0;
        int *updateValue;
        bool isAdd = forward <= 1;
        if (forward == 0 || forward == 2)
        {
            from = y;
            if (yMap.find(x) == yMap.end())
            {
                y = y + (forward == 0 ? step : step * -1);
                return;
            }
            updateValue = &y;
            list = &(yMap[x]);
        }
        else if (forward == 1 || forward == 3)
        {
            from = x;
            if (xMap.find(y) == xMap.end())
            {
                x = x + (forward == 1 ? step : step * -1);
                return;
            }
            updateValue = &x;
            list = &(xMap[y]);
        }
        int index = findIndex(list, from, isAdd);
        if (index == -1 || index == list->size())
        {
            *updateValue = from + (isAdd ? step : step * -1);
            return;
        }
        // int expect = from + (isAdd ? step : step * -1);//
        int canMove = abs((*list)[index] - from) - 1;
        if (step > canMove)
        {
            *updateValue = from + (isAdd ? canMove : canMove * -1);
        }
        else
        {
            *updateValue = from + (isAdd ? step : step * -1);
        }
    }

    int correctForward(int forward)
    {
        if (forward < 0)
        {
            return 3;
        }
        if (forward > 3)
        {
            return 0;
        }
        return forward;
    }

    int robotSim(vector<int> &commands, vector<vector<int>> &obstacles)
    {
        map<int, vector<int>> xMap;
        map<int, vector<int>> yMap;

        for (vector<int> v : obstacles)
        {
            int x = v[0];
            int y = v[1];
            if (xMap.find(y) == xMap.end())
            {
                xMap[y] = vector<int>();
            }
            xMap[y].push_back(x);

            if (yMap.find(x) == yMap.end())
            {
                yMap[x] = vector<int>();
            }
            yMap[x].push_back(y);
        }
        int max = 0;
        // 排序
        for (auto at = xMap.begin(); at != xMap.end(); at++)
        {
            std::vector<int> &value = at->second;
            sort(value.begin(), value.end());
        }
        for (auto at = yMap.begin(); at != yMap.end(); at++)
        {
            std::vector<int> &value = at->second;
            sort(value.begin(), value.end());
        }
        int forward = 0;
        int x = 0;
        int y = 0;

        for (int i = 0; i < commands.size(); i++)
        {
            int command = commands[i];
            if (command == -2)
            {
                forward = correctForward(forward - 1);
            }
            else if (command == -1)
            {
                forward = correctForward(forward + 1);
            }
            else
            {
                takeStep(xMap, yMap, x, y, forward, command);
            }
            cout << "command:" << command << ",forward:" << forward << ",x:" << x << ",y:" << y << ",value:" << (x * x + y * y) << endl;
            max = std::max(max, x * x + y * y);
        }
        return max;
    }
};

到了這里,關(guān)于?LeetCode解法匯總874. 模擬行走機(jī)器人的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 每日一題(set集合)-874. 模擬行走機(jī)器人

    874. 模擬行走機(jī)器人 初始方向朝y軸正方向,遇到指令command == -1 則向右轉(zhuǎn), 若為 -2 則向左轉(zhuǎn) 定義方向[-1,0]、[0,1]、[1,0]、[0,-1] 分別為朝x軸負(fù)方向, y軸正方向, x軸正方向,y軸負(fù)方向 初始方向?yàn)閇0,1], 若向右轉(zhuǎn) 則方向變?yōu)閇-1,0]、若向左轉(zhuǎn)方向變?yōu)閇1,0]。 若向右轉(zhuǎn)則不斷 向右

    2024年02月13日
    瀏覽(28)
  • 暑期代碼每日一練Day3:874. 模擬行走機(jī)器人

    暑期代碼每日一練Day3:874. 模擬行走機(jī)器人

    題目 874. 模擬行走機(jī)器人 分析 這道題就是個簡單的模擬 主要有兩點(diǎn)考察點(diǎn): 對 方向數(shù)組 的運(yùn)用 方向數(shù)組存儲的是各個方向的單位向量,也即: 方向 X Y 向北 0 1 向東 1 0 向南 0 -1 向西 -1 0 存儲在數(shù)組中,則是方向數(shù)組: 我們很容易發(fā)現(xiàn): 我們可以使用一個變量 j 來指示當(dāng)

    2024年02月16日
    瀏覽(25)
  • 【LeetCode 算法】Walking Robot Simulation 模擬行走機(jī)器人 - 二分

    機(jī)器人在一個無限大小的 XY 網(wǎng)格平面上行走,從點(diǎn) (0, 0) 處開始出發(fā),面向北方。該機(jī)器人可以接收以下三種類型的命令 commands : -2 :向左轉(zhuǎn) 90 度 -1 :向右轉(zhuǎn) 90 度 1 = x = 9 1 = x = 9 1 = x = 9 :向前移動 x 個單位長度 在網(wǎng)格上有一些格子被視為障礙物 obstacles 。第 i 個障礙物位

    2024年02月11日
    瀏覽(21)
  • 【LeetCode 算法】Walking Robot Simulation 模擬行走機(jī)器人 - 哈希

    機(jī)器人在一個無限大小的 XY 網(wǎng)格平面上行走,從點(diǎn) (0, 0) 處開始出發(fā),面向北方。該機(jī)器人可以接收以下三種類型的命令 commands : -2 :向左轉(zhuǎn) 90 度 -1 :向右轉(zhuǎn) 90 度 1 = x = 9 1 = x = 9 1 = x = 9 :向前移動 x 個單位長度 在網(wǎng)格上有一些格子被視為障礙物 obstacles 。第 i 個障礙物位

    2024年02月15日
    瀏覽(24)
  • 【經(jīng)典LeetCode算法題目專欄分類】【第5期】貪心算法:分發(fā)餅干、跳躍游戲、模擬行走機(jī)器人

    【經(jīng)典LeetCode算法題目專欄分類】【第5期】貪心算法:分發(fā)餅干、跳躍游戲、模擬行走機(jī)器人

    《博主簡介》 小伙伴們好,我是阿旭。專注于人工智能AI、python、計算機(jī)視覺相關(guān)分享研究。 ? 更多學(xué)習(xí)資源,可關(guān)注公-仲-hao:【阿旭算法與機(jī)器學(xué)習(xí)】,共同學(xué)習(xí)交流~ ?? 感謝小伙伴 們點(diǎn)贊、關(guān)注! class ? Solution : ???? def ? findContentChildren ( self , ?g : ?List [ int ], ?s

    2024年02月04日
    瀏覽(29)
  • 【算法-數(shù)組-pyhton】模擬行走機(jī)器人

    【算法-數(shù)組-pyhton】模擬行走機(jī)器人

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年02月12日
    瀏覽(19)
  • leetcode刷題(字符串相加、包含每個查詢的最小區(qū)間、模擬行走機(jī)器人、環(huán)形子數(shù)組的最大和、滿足不等式的最大值、四數(shù)之和、樹中距離之和)

    leetcode刷題(字符串相加、包含每個查詢的最小區(qū)間、模擬行走機(jī)器人、環(huán)形子數(shù)組的最大和、滿足不等式的最大值、四數(shù)之和、樹中距離之和)

    目錄 1、字符串相加 2、包含每個查詢的最小區(qū)間 3、模擬行走機(jī)器人 4、環(huán)形子數(shù)組的最大和 5、滿足不等式的最大值 6、四數(shù)之和 7、 樹中距離之和

    2024年02月10日
    瀏覽(27)
  • ?力扣解法匯總1041. 困于環(huán)中的機(jī)器人

    https://github.com/September26/java-algorithms 在無限的平面上,機(jī)器人最初位于? (0, 0) ?處,面朝北方。注意: 北方向 ?是y軸的正方向。 南方向 ?是y軸的負(fù)方向。 東方向 ?是x軸的正方向。 西方向 ?是x軸的負(fù)方向。 機(jī)器人可以接受下列三條指令之一: \\\"G\\\" :直走 1 個單位 \\\"L\\\" :左轉(zhuǎn)

    2023年04月11日
    瀏覽(21)
  • 能“出汗”,會“呼吸”的戶外行走機(jī)器人

    能“出汗”,會“呼吸”的戶外行走機(jī)器人

    美國亞利桑那州立大學(xué)(ASU)科學(xué)家研制出了世界上第一個能像人類一樣出汗、顫抖和呼吸的戶外行走機(jī)器人模型。這個機(jī)器人名叫ANDI,是一個能模仿人類出汗的熱敏“熱模型”。 ANDI 身上不僅有可以使它行走的關(guān)節(jié),還有其他機(jī)器人身上都沒有的東西——它渾身上下還有 35

    2024年02月14日
    瀏覽(20)
  • 論文閱讀:四足機(jī)器人對抗運(yùn)動先驗(yàn)學(xué)習(xí)穩(wěn)健和敏捷的行走

    論文閱讀:四足機(jī)器人對抗運(yùn)動先驗(yàn)學(xué)習(xí)穩(wěn)健和敏捷的行走

    論文:Learning Robust and Agile Legged Locomotion Using Adversarial Motion Priors 進(jìn)一步學(xué)習(xí):AMP,baseline方法,TO 介紹了一種新穎的系統(tǒng),通過使用對抗性運(yùn)動先驗(yàn) (AMP) 使四足機(jī)器人在復(fù)雜地形上實(shí)現(xiàn)穩(wěn)健和敏捷的行走。主要貢獻(xiàn)包括為機(jī)器人生成AMP數(shù)據(jù)集,并提出一種教師-學(xué)生訓(xùn)練框架

    2024年02月21日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包