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() 里面最大的元素
}
}