Interview150

数组和字符串

88 合并两个有序数组

思路中,正序考虑的东西很多,可以倒序插入

因为nums1在后面的数组为空

具体思路:

设定nums1 的index 为 m-1即数组一中最大值
设定nums2 的index为n-1即数组二中最大值
设定一个总的index为了插入数字

循环开始
因为要合并到nums1中,
就要确定nums2是否全部放入nums1中
比较nums1 和nums2的值的大小,谁大谁就在最后
在放nums1值时要确定index1是否大于0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int index1 = m - 1;
int index2 = n - 1;

int index = nums1.length - 1;

while(index2 >= 0){
if (index1 >= 0 && nums1[index1] > nums2[index2]){
nums1[index--] = nums1[index1--];
} else {
nums1[index--] = nums2[index2--];
}
}
}
}

27 移除元素

左右指针,不需要确定右指针是不是val,或者利用while loop确定右指针指到第一个不是val的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while (left <= right){
if (nums[left] == val){
nums[left] = nums[right--];
} else {
left++;
}
}

return left;
}
}

26 删除有序数组中的重复项

注意快慢指针的变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int removeDuplicates(int[] nums) {
int slowIndex = 0;
int fastIndex = 0;

while (fastIndex < nums.length){
if (nums[fastIndex] != nums[slowIndex]){
nums[++slowIndex] = nums[fastIndex];
}
fastIndex++;
}

return slowIndex + 1;
}
}

80. 删除有序数组中的重复项 II

利用快慢指针

在快指针还没有到终点时
快指针和慢指针一起走,一起经历一个if循环,查看当前快指针,和前一个慢指针的点是否一致,一致则通过该点,此时快指针应移到不等于慢指针的前一个节点的点上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length < 3) return nums.length;

int slowIndex = 0;
int fastIndex = 0;
while (fastIndex < nums.length){
nums[slowIndex++] = nums[fastIndex++];
if (fastIndex < nums.length && nums[fastIndex] == nums[slowIndex - 1])
nums[slowIndex++] = nums[fastIndex++];

while (fastIndex< nums.length && nums[fastIndex] == nums[slowIndex - 1]) fastIndex++;
}

return slowIndex;

}
}

169 多数元素

此题主要熟悉map的用法
利用map统计元素出现次数

利用for loop查看所有元素的次数

for(Map.Entry<Integer, Integer> entry : map.entrySet()){
}

entry.getValue()
entry.getKey();

具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int majorityElement(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int i : nums){
map.put(i, map.getOrDefault(i, 0) + 1);
}

for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() > nums.length / 2) {
return entry.getKey();
}
}

return 0;
}
}

189 旋转数组

此题和反转字符串是一个思路,
首先整体反转
之后再局部反转
如果K=3, 前三个翻转,后面的翻转

唯一需要注意的是k值的转化,k值可能大于数组长度,所以需要去k%num.length的余数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverseArray(nums, 0, nums.length - 1);
reverseArray(nums, 0, k - 1);
reverseArray(nums, k, nums.length - 1);
}
private void reverseArray(int[] nums, int start, int end){
while (start <= end){
int temp = nums[start];
nums[start++] = nums[end];
nums[end--] = temp;
}
}
}

121 购入股票最好时机

此题贪心算法,累加到是负值,清空重新计算,中间记录最大值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length <= 1) return 0;

int sum = 0;
int max = Integer.MIN_VALUE;
for (int i = 1; i < prices.length; i++){
sum += prices[i] - prices[i - 1];
if (sum < 0){
sum = 0;
} else {
max = Math.max(max, sum);
}
}

return max == Integer.MIN_VALUE ? 0 : max;
}
}

122 购入股票的最好时机II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length <= 1) return 0;

int sum = 0;

for (int i = 1; i< prices.length; i++){
if (prices[i] - prices[i - 1] > 0){
sum += prices[i] - prices[i - 1];
}
}

return sum;
}
}

55 跳跃游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length <= 1) return 0;

int sum = 0;

for (int i = 1; i< prices.length; i++){
if (prices[i] - prices[i - 1] > 0){
sum += prices[i] - prices[i - 1];
}
}

return sum;
}
}

45 跳跃游戏II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public int jump(int[] nums) {
if (nums == null || nums.length <= 1) return 0;
int count = 0;
int maxLen = 0;
int curLen = 0;
for (int i = 0; i < nums.length; i++){
maxLen = Math.max(maxLen, i + nums[i]);
if (maxLen >= nums.length - 1) return ++count;

if (i == curLen){
curLen = maxLen;
count++;
}
}

return count;
}
}

274 H-index

利用binary search,所有数值,数出每一组mid的count值,进行比较,多了,就取右边,少了就取左边,最后输出一个值

不能用位运算

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int hIndex(int[] c) {
int low=0 , high = c.length;
while(low < high){
int mid = (low+high+1)/2;
int cnt=0;
for(int i=0 ; i<c.length ; i++) if(c[i] >= mid) cnt++;
if(cnt >= mid) low = mid;
else high = high=mid-1;
}
return low;
}
}