行星的颜色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行星的颜色相关的知识,希望对你有一定的参考价值。

参考技术A 水星:灰色 金星:橙啡色 地球:蓝色(海洋)
绿色(草原)
白色(白云) 火星:火红色 木星:啡色
红色(大红斑) 土星:浅啡色 天王星:浅蓝色 海王星:深蓝色
黑色(大黑班)
Mercury:Grey Venus:Gold(covered with thick clouds) Earth:Blue(sea)
Green(flatland)
White(North Pole and South Pole)and Brown (Mountains) Mars:Red
White(Two ice caps) Jupiter:Brown(Hydrogen)
White ties and Red ties(Storms) Saturn:Tan Uranus:Half-Green and Half- Light Blue Neptune:Dark Blue and White(Storms)
参考: My learning experience
水星:灰色 金星:啡橙色(耀眼) 地球:蓝色(海洋)、绿色(草原)、白色(白云) 火星:火红色 木星:啡色(有点金色)、红色(大红斑) 土星:浅啡色、绿色 天王星:浅蓝色、翠绿色 海王星:深蓝色(不算太深色,比天王星深色一点) 行星颜色图:.image.search.yahoo/images/view?back=%3A%2F%2F.image.search.yahoo%2Fsearch%2Fimages%3Fp%3D%25E6%25B0%25B4%25E6%2598%259F%26js%3D1%26ei%3Dutf-8%26fr%3DFP-tab-web-t&w=300&h=292&imgurl=a4.att.hudong%2F24%2F61%2F01300000240289122106617884008&rurl=%3A%2F%2Fflower.80code%2Fkuruma%2Findex%3Fk%3D%25BF%25E5%25C0%25B1&size=15k&name=0130000024028912...&p=%E6%B0%B4%E6%98%9F&oid=627532ff5dc1eb10&fr2=&no=2&tt=98881&sigr=11oggisvp&sigi=11p1895tu&sigb=13188a9ev&.crumb=t6MV8neWoBg
参考: mine
.image.search.yahoo/images/view?back=%3A%2F%2F.image.search.yahoo%2Fsearch%2Fimages%3Fp%3D%25E6%25B0%25B4%25E6%2598%259F%26ei%3DUTF-8%26meta%3Drst%253D%26fr%3DFP-tab-img-t&w=300&h=292&imgurl=a4.att.hudong%2F24%2F61%2F01300000240289122106617884008&rurl=%3A%2F
Mercury:Grey Venus:Gold Earth:Blue
green and white Mars:Red Jupiter:Brown Saturn:Gold yellow Uranus:Sky blue Neptune:Sea blue

LeetCode——735.行星碰撞

给定一个整数数组 asteroids,表示在同一行的行星。

对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。

找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

示例 1:

输入: 
asteroids = [5, 10, -5]
输出: [5, 10]
解释: 
10 和 -5 碰撞后只剩下 10。 5 和 10 永远不会发生碰撞。
示例 2:

输入: 
asteroids = [8, -8]
输出: []
解释: 
8 和 -8 碰撞后,两者都发生爆炸。
示例 3:

输入: 
asteroids = [10, 2, -5]
输出: [10]
解释: 
2 和 -5 发生碰撞后剩下 -5。10 和 -5 发生碰撞后剩下 10。
示例 4:

输入: 
asteroids = [-2, -1, 1, 2]
输出: [-2, -1, 1, 2]
解释: 
-2 和 -1 向左移动,而 1 和 2 向右移动。
由于移动方向相同的行星不会发生碰撞,所以最终没有行星发生碰撞。

说明:

数组 asteroids 的长度不超过 10000。
每一颗行星的大小都是非零整数,范围是 [-1000, 1000] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/asteroid-collision

方法:栈

如果不会发生碰撞那么一排小行星是处于稳定的状态。若在右边增加一个新的小行星后,在它再次稳定之前,可能会发生更多的碰撞,而所有的这些碰撞(如果发生的话)都必须从右到左发生。这种情况非常适合用栈解决。

算法:

假设栈中顶部元素为 top,一个新的小行星 new 进来了。如果 new 向右移动(new>0),或者 top 向左移动(top<0),则不会发生碰撞。
否则,如果 abs(new) < abs(top),则新小行星 new 将爆炸;如果 abs(new) == abs(top),则两个小行星都将爆炸;如果 abs(new) > abs(top),则 top 小行星将爆炸(可能还会有更多小行星爆炸,因此我们应继续检查)。

python

class Solution(object):
    def asteroidCollision(self, asteroids):
        ans = []
        for new in asteroids:
            while ans and new < 0 < ans[-1]:
                if ans[-1] < -new:
                    ans.pop()
                    continue
                elif ans[-1] == -new:
                    ans.pop()
                break
            else:
                ans.append(new)
        return ans

java

class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        Stack<Integer> stack = new Stack();
        for (int ast: asteroids) {
            collision: {
                while (!stack.isEmpty() && ast < 0 && 0 < stack.peek()) {
                    if (stack.peek() < -ast) {
                        stack.pop();
                        continue;
                    } else if (stack.peek() == -ast) {
                        stack.pop();
                    }
                    break collision;
                }
                stack.push(ast);
            }
        }

        int[] ans = new int[stack.size()];
        for (int t = ans.length - 1; t >= 0; --t) {
            ans[t] = stack.pop();
        }
        return ans;
    }
}

复杂度分析

时间复杂度:O(N),其中 N 是行星的数量。
空间复杂度:O(N),ans 使用的空间。

这道题用一个数组来模拟行星碰撞,正数代表行星向右移动,负数表示向左移动,绝对值大小表示行星的质量,如果两个相邻的行星相向移动会碰撞,质量大的行星会完好无损的保存,质量小的就会灰飞烟灭。那么博主最开始想的方法就是按照题目要求来一个一个的处理,我们先把给定的数组放到结果res中,然后进行while循环,如果此时结果res中的数字个数小于等于1个,直接返回即可,没有可碰撞的了。否则我们建立一个临时数组t,把结果res中的首元素放到t中,然后从第二个数字开始遍历结果res,如果此时t为空了,或者当前数字大于0而t数组最后一个数字小于0(此时两个行星向相反方向运动,不会相撞),或者两个数字的符号相同(此时两个行星向同一个方向运动,不会相撞),这三种情况下都把当前数字res[i]加到数组t中;那么剩下的情况就是两个行星相向运动了,如果两个数字相加等于0,则说明两个行星质量相同,且相向运动,则一起消失,我们将数组t中最后一个数字移除;如果当前数字小于0,且两个数字相加小于0,那么此时相撞后会留下质量大的行星,我们将数组t的最后一个数字赋值为res[i]即可。for循环之和,如果数组t和结果res的大小相等,说明此时状态已经稳定了,我们直接break,否则就把数组t赋值给结果res并继续循环,参见代码如下:

解法一:

class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        vector<int> res = asteroids;
        while (true) {
            if (res.size() <= 1) return res;
            vector<int> t{res[0]};
            for (int i = 1; i < res.size(); ++i) {
                if (t.empty() || (res[i] > 0 && t.back() < 0) || res[i] * t.back() > 0) {
                    t.push_back(res[i]);
                } else if (res[i] + t.back() == 0) {
                    t.pop_back();
                } else if (res[i] < 0 && res[i] + t.back() < 0) {
                     t.back() = res[i];
                }
            }
            if (t.size() == res.size()) break;
            else res = t;
        }
        return res;
    }
};

实际上我们可以写的更加简洁一些,我们遍历所有的数字,如果当前数字是正数的话,我们直接加入结果res;否则我们遇到的都是负数,如果结果res为空,或者结果res的最后一个数字小于0(此时两个行星同时向左运动),直接将当前数字加入结果res;如果结果res的最后一个数字(此时为正数)小于当前数字的绝对值,说明碰撞后消失了,那么我们将i自减一个,然后将res最后一个数字移除,这样下次遍历的时候还是这个质量大的行星。如果两个质量相等,那么直接移除res最后一个数字,此时两个行星都消失了,参见代码如下:

解法二:

class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        vector<int> res;
        for (int i = 0; i < asteroids.size(); ++i) {
            if (asteroids[i] > 0) {
                res.push_back(asteroids[i]);
            } else if (res.empty() || res.back() < 0) {
                res.push_back(asteroids[i]);
            } else if (res.back() <= -asteroids[i]) {
                if (res.back() < -asteroids[i]) --i;
                res.pop_back();
            }
        }
        return res;
    }
};

以上是关于行星的颜色的主要内容,如果未能解决你的问题,请参考以下文章

Torus 的纹理未正确应用

出现白色的地球怎么解决osgearth

此顶点着色器中的统一浮动不起作用

如何把RGB颜色对应成一个数值

SecureCRT颜色设置问题

android:从颜色到颜色的动画颜色变化