0
点赞
收藏
分享

微信扫一扫

顶底预测 反转指标 文华财经指标公式源码 九稳量化系统 好用的期货指标公式顶底预测 期货指标公式精准买卖点无滞后顶底预测

非衣所思 2024-08-05 阅读 27
算法

134.加油站

 代码随想录

索引01234
gas12345
cost34512

计算每个加油站的剩余油量,累计sum,一旦<0就从下一个重新计数。

我还没理解为什么我们不需要计算环路的sum,而是只需要遍历一次。

因为使用了两个变量:curSum 和totalSum ,totalSum最终一旦小于0,说明怎么都不可能跑完一圈。curSum是为了求取出发点。

代码

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int curSum = 0;
        int totalSum = 0;
        int start = 0;
        for(int i = 0;i<gas.length;i++){
            curSum += (gas[i] - cost[i]);
            totalSum += (gas[i]-cost[i]);
            if(curSum<0){
                start = i+1;
                curSum = 0;
            }
        }
        if(totalSum<0)return -1;
        return start;
    }
}

 135.分发糖果

 代码随想录

一次遍历两边都要考虑会顾此失彼,正确思路是先确定一边,再确定另一边。

正序先确定一边,因为第一个小孩糖果数确定为1:右边小孩比左边小孩得分高,if(right>left) candy[i] = candy[i-1]+1;

倒序再确定另一边,因为最后一个小孩糖果数确定为1:左孩子比右边孩子得分高,if(left

>right) candy[i] = Math.max(candy[i-1]+1,candy[i]);

关于倒序取Max值的困惑:

代码

class Solution {
    public int candy(int[] ratings) {
        int[] candy = new int[ratings.length];
        candy[0] = 1;
        for (int i = 1;i<ratings.length;i++){
            candy[i] = (ratings[i]>ratings[i-1])?candy[i-1]+1:1;
        }
        for(int i = ratings.length-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                candy[i] = Math.max(candy[i+1]+1,candy[i]);
            }
        }
        return getSum(candy);
    }
    public int getSum(int[] candy){
        int sum = 0;
        for (int i : candy) {
            sum+=i;
        }
        return sum;
    }
}

 860.柠檬水找零

代码

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int fiveCount = 0;
        int tenCount = 0;
        for(int i = 0;i<bills.length;i++){
            if(bills[i]==5) {
                fiveCount++;
            }else if(bills[i]==10){
                tenCount++;
                fiveCount--;
            }else if(bills[i]==20){
                if(tenCount>0){
                    tenCount--;
                    fiveCount--;
                }else{
                    fiveCount = fiveCount-3;
                }
            }
            if(fiveCount<0||tenCount<0){
                return false;
            }
        }
        return true;
    }
}

406.身高排序[代码重刷]

 代码随想录

先确定H维度;按照身高从大到小排列,当身高相同时按照K从小到大排列。就保证了数组向前插入时前面的人身高一定比它高,从而保证被插入的数组K值不会有任何影响。

再确定K维度:再按照K值插到前面的位置。

代码

Arrays.sort自定义排序使用,LinkedList适合挪动元素插入删除操作,linkedList转换成nt[][]数组,这些调用都不会,因此需要代码重刷

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people,(a,b)->{
            if(a[0]==b[0]) return a[1]-b[1];//身高相同时,按照K值升序排列
            return b[0]-a[0];//否则直接按照身高降序排列
        });
        LinkedList<int[]> deque = new LinkedList<>();
        for (int[] person : people) {
            deque.add(person[1],person);
        }
        return deque.toArray(new int[people.length][]);
    }
}
举报

相关推荐

0 条评论