LeetCode905.按奇偶排序数组~~~~724. 寻找数组的中心索引~~~~66.加一~~~~414.第三大的数

LeetCode905.按奇偶排序数组

给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。
  • 示例:
    输入:[3,1,2,4]
    输出:[2,4,3,1]
    输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
  • 提示:
    1 <= A.length <= 5000
    0 <= A[i] <= 5000
class Solution {
    public int[] sortArrayByParity(int[] A) {
        int cur=0;
        int end=A.length;
        while(cur<end){
            if(A[cur]%2==0){
                cur++;
            }else{
                swap(A,cur,end-1);
                end--;
            }
        }
        return A;
    }
    public void swap(int[] A,int cur,int end){
        int temp=A[cur];
        A[cur]=A[end];
        A[end]=temp;
    }
}

LeetCode724. 寻找数组的中心索引

给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。

我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。

  • 示例 1:
    输入:
    nums = [1, 7, 3, 6, 5, 6]
    输出: 3
    • 解释:
      索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等。
      同时, 3 也是第一个符合要求的中心索引。
  • 示例 2:
    输入:
    nums = [1, 2, 3]
    输出: -1
    • 解释:
      数组中不存在满足此条件的中心索引。
      说明:
      nums 的长度范围为 [0, 10000]。
      任何一个 nums[i] 将会是一个范围在 [-1000, 1000]的整数。
思路:S 是数组的和,当索引 i 是中心索引时,位于 i 左边数组元素的和 leftsum 满足 S - nums[i] - leftsum
class Solution {
    public int pivotIndex(int[] nums) {
       int sum=0;
       int leftSum=0;
       for(int i=0;i<nums.length;i++){
           sum+=nums[i];
       }
       for(int j=0;j<nums.length;j++){
           if(leftSum==sum-leftSum-nums[j]){
               return j;
           }
           leftSum+=nums[j];
       }
       return -1;
    }
}

LeetCode66.加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

  • 示例 1:
    输入: [1,2,3]
    输出: [1,2,4]
    解释: 输入数组表示数字 123。
  • 示例 2:
    输入: [4,3,2,1]
    输出: [4,3,2,2]
    解释: 输入数组表示数字 4321。
  • 情况有两种:
    1.个位数为一般数字或9
    2.99,9999等
class Solution {
    public int[] plusOne(int[] digits) {
        int len=digits.length;
        for(int i=len-1;i>=0;i--){
            digits[i]++;
            digits[i]=digits[i]%10;
            if(digits[i]!=0){
                return digits;
            }
        }
        //如果持续到最前面的数字还是9,没有执行到if的里面
        digits=new int[len+1];
        digits[0]=1;
        return digits;
    }
}

LeetCode414.第三大的数

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
  • 示例 1:
    输入: [3, 2, 1]
    输出: 1
    解释: 第三大的数是 1.
  • 示例 2:
    输入: [1, 2]
    输出: 2
    解释: 第三大的数不存在, 所以返回最大的数 2 .
  • 示例 3:
    输入: [2, 2, 3, 1]
    输出: 1
    解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
    存在两个值为2的数,它们都排第二。
  • 借用TreeSet(红黑树) O(n)
    维护一个只有3个元素的TreeSet,如果大于三个元素就就把Set中的最小最小值remove掉。
    最后如果Set中元素小于3就返回Set最大值,否则返回最小值。
class Solution {
    public int thirdMax(int[] nums) {
        if (nums == null || nums.length == 0) throw new RuntimeException("error");

        TreeSet<Integer> set = new TreeSet<>();
        for (Integer elem : nums) {
            set.add(elem);
            if (set.size() > 3) set.remove(set.first());
        }
        return set.size() < 3 ? set.last() : set.first();   // set.last() 里面最大的元素
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值