【备战字节面试】算法特训-数组

150 阅读1分钟

简单粗暴,记录备战过程,持续更新

数组

字符串大家太熟了,不过算法题可不简单。解题思路一样,但是每个语言的实现可打不同,熟悉默写jdk函数。

适用场景

实战

实战1 leetcode 354. 俄罗斯套娃信封问题

实战2 leetcode 674. 最长连续递增序列

import java.util.*;

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int len = nums.length;
        if(len <= 0){
            return 0;
        }
        int maxLen = 0;
        int slow = 0;
        int fast = 1;
        while(fast < len){
            // 右边小于等于左边
            if(nums[fast] <= nums[fast-1] ){
                maxLen = Math.max(maxLen,fast-slow);
                slow = fast;
            }
            fast++;
        }
        maxLen = Math.max(maxLen,fast-slow);
        return maxLen;
    }
}

实战3 leetcode 128. 最长连续序列

import java.util.*;

class Solution {
    public int longestConsecutive(int[] nums) {
        int len = nums.length;
        if(len <=0 ){
            return 0;
        }
        // 哈希
        Set<Integer> numSet = new HashSet<>();
        for(int i = 0; i< len; i++){
            numSet.add(nums[i]);
        }
        int ans = 0;
        // 遍历
        for(int num : numSet){
            // 有小于的就忽略
            if(!numSet.contains(num-1)){
                int numTmp = num + 1;
                int ansTmp = 1;
                // 包含递增元素
                while(numSet.contains(numTmp)){
                    ansTmp++;
                    numTmp++;
                }
                ans = Math.max(ans,ansTmp);
            }
        }
        return ans;
    }
}

实战4 leetcode 11. 盛最多水的容器

import java.util.*;

class Solution {
    public int maxArea(int[] height) {
        int len = height.length;
        if(len <= 1){
            return 0;
        }
        int ans = 0; 
        int left = 0 ;
        int right = len - 1;
        while(left < right){
            int minHeight = Math.min(height[left],height[right]);
            int ansTmp = minHeight * (right - left);
            ans = Math.max(ansTmp,ans);  
            if(left < right){
                left++;
            }else{
                right--;
            }
        }
        return ans;
    }
}

实战5 leetcode 4. 寻找两个正序数组的中位数

不会,TODO

实战6 leetcode 26. 删除有序数组中的重复项

class Solution {
    public int removeDuplicates(int[] nums) {
        int len = nums.length;
        if(len <= 0){
            return 0;
        }
        int slow = 1;
        int fast = 1;
        while(fast < len){
            if(nums[fast] != nums[fast-1] ){
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
}

实战6 leetcdoe 560. 和为 K 的子数组

import java.util.*;

class Solution {
    public int subarraySum(int[] nums, int k) {
        int len = nums.length;

        int ans = 0 ;
        int sum = 0 ;
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,1);
        for(int i = 0; i < len ; i++){
            sum += nums[i];
            if(map.containsKey(sum - k)){
               int count = map.get(sum - k);
               ans += count;
            }
            map.put(sum , map.getOrDefault(sum ,0) +1 );
        }
        return ans;
    }
}

实战7 leetcode 167. 两数之和 II - 输入有序数组

import java.util.*;

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int len = numbers.length;
        Map<Integer,Integer> map = new HashMap<>();
        int [] ret = new int[2];
        for(int i = 0; i < len;i++){
            if(map.containsKey(target - numbers[i])){
                ret[0] = map.get(target - numbers[i]) +1;
                ret[1] = i + 1;
                break;
            }
            map.put(numbers[i],i);
        }
        return ret;
    }
}

实战8 LeetCode 15 三数之和

不会,TODO

实战9 LeetCode 18 四数之和

不会,TODO

实战10 leetcode 55. 跳跃游戏

class Solution {
    public boolean canJump(int[] nums) {
        int len = nums.length;
        int canReach = len - 1;
        for(int i = len -1 ; i >= 0; i-- ){
            if(nums[i] >= (canReach - i)){
                canReach = i;
            }
        }
        return canReach == 0 ? true : false;
    }
}

实战11 leetcode 45. 跳跃游戏 II

import java.util.*;

class Solution {
    public int jump(int[] nums) {
        int step = 0;
        int canReach = 0;
        int nextReach = 0;
        int len = nums.length;
        for(int i = 0; i < len-1  ;i++ ){
            canReach = Math.max(canReach,nums[i]+i);
            if(nextReach == i){
                step++;
                nextReach = canReach;
            }
        }
        return step;
    }
}