LeetCode-1523/1491/860/976

1.在区间范围内统计奇数数目(1523)

题目描述:

给你两个非负整数 low 和 high 。请你返回 low 和 high 之间(包括二者)奇数的数目。
LeetCode-1523/1491/860/976_第1张图片
思路一: 这里肯定会想到以low和high分别为上下限,然后遍历如果为奇数就将设置的计数加一即可,但是这样会超时,所以不能一个一个遍历。可以改良一下,先在上下限内找到第一个奇数后再每次加二的速度来遍历这样提交就能通过了。

思路二: 这是官方题解中的思路,简单清晰。先求1到low-1的奇数个数,再求1到high的奇数个数,相减即可。因为1到一个数字num的范围内的奇数个数是(num+1)/2,所以这个思路代码写起来很简单。

代码:

class Solution {
    public int countOdds(int low, int high) {
    
        //return countOdds1(low,high);
        return countOdds2(low,high);
    }

    public int countOdds2(int low,int high) {
        return (high+1)/2-low/2;
    }
    public int countOdds1(int low, int high) {
        int count=0;
        if(low%2==0) {
            low+=1;
        }

        for(int i=low;i<=high;i+=2) {
            count++;
        }
        return count;
    }
}

2.去掉最低工资和最高工资后的工资平均值(1491)

题目描述:

给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。

请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。
LeetCode-1523/1491/860/976_第2张图片
思路: 这题很简单,遍历数组同时设置两个变量max和min分别记录最大值和最小值,以及设置一个变量来累加数组中元素,然后返回值就是累加值减掉max和min。

代码:

class Solution {
    public double average(int[] salary) {
        int max=0,min=Integer.MAX_VALUE;
        int sum=0;
        for(int i=0;i<salary.length;i++) {
            sum+=salary[i];
            if(max<=salary[i]) {
                max=salary[i];
            }
            if(min>=salary[i]) {
                min=salary[i];
            }
        }

        return (double)(sum-max-min)/(salary.length-2);

    }
}

3.柠檬水找零(860)

题目描述:

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
LeetCode-1523/1491/860/976_第3张图片
思路: 在遍历bills数组之前先建立一个数组记录5,10,20美元的数目,然后开始遍历bills数组,如果是5就将数目加一。如果是10就先判断5的数目是否大于等于1因为这样才能找开,如果大于等于1,5的数目减一,10的数目加一。如果是20,分两种情况,如果5的数目大于等于1并且10大于等于1那么可以找开,如果5的数目大于等于3也可以找开。具体看代码。

代码:

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int sum=0;
        int[] record=new int[3];
        for(int i=0;i<bills.length;i++) { 
            switch(bills[i]) {
                case 5:
                    record[0]+=1;
                    break;
                case 10:
                    if(record[0]<1) {
                        return false;
                    } else {
                        record[0]-=1;
                        record[1]+=1;
                    }
                    break;
                case 20:
                    if(record[0]>=1&&record[1]>=1) {
                        record[0]-=1;
                        record[1]-=1;
                        record[2]+=1;
                        
                    } else if(record[0]>=3) {
                        record[0]-=3;
                        record[2]+=1;
                        
                    } else {
                        return false;
                    }
                    break;
                    
            }
            
        }
        return true;
    }
}

4.三角形的最大周长(976)

题目描述:

给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。
LeetCode-1523/1491/860/976_第4张图片
思路: 这题很简单,首先排序数组,之后从数组尾部开始遍历,如果有满足三角形条件的就直接返回三条边的和。这个值肯定是最大的周长,这里遍历的一点点细节看代码。

代码:

class Solution {
    public int largestPerimeter(int[] nums) {
        int max=0;
        Arrays.sort(nums);
        for(int i=nums.length-1;i>=2;i--) {
            if(nums[i]<nums[i-1]+nums[i-2]) {
                return nums[i]+nums[i-1]+nums[i-2];
            }
        }
        return 0;
    }
}

你可能感兴趣的:(leetcode,算法,力扣)