奇妙的算法【11】LeetCode-专属算法面试题汇总

  这个是LeetCode上面的编程训练专项页面,地址:https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in-2018/262/summery/

  总体,比较系统、全面。在解决这些问题的时候,我都是先尝试使用自己的方法coding一遍,之后在看看其他比较巧妙的解决方法学习一下。

0,热身编程题

  0.1只出现一次的数字

  给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

package com.cnblogs.mufasa.QA1_makeAhotDOU;

import org.junit.Test;
import java.util.Arrays;

public class Solution1 {

    //速度也还行,时间复杂度大致为O(nlogn+n/2),相对性能要差一些
    public static int singleNumber1(int[] nums) {
        Arrays.sort(nums);
        int len=nums.length-1;
        for(int i=0;i<len;i+=2){
            if(nums[i]!=nums[i+1]){
                return nums[i];
            }
        }
        return nums[len];
    }

    //***最优化的解法***,时间复杂度为O(n)
    public static int singleNumber(int[] nums) {
        int temp=nums[0];
        for(int i=1;i<nums.length;i++){
            temp^=nums[i];
        }
        return temp;
    }

    @Test
    public void test() {
//        int[] nums=new int[]{1,1,2,2,6,7,7,6};
        int[] nums=new int[]{4,1,2,1,2};
        System.out.println(singleNumber(nums));
        System.out.println(singleNumber1(nums));
    }
}

  0.2求众数

  给定一个大小为 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

  你可以假设数组是非空的,并且给定的数组总是存在众数。

package com.cnblogs.mufasa.QA1_makeAhotDOU;

import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;

public class Solution2 {

    //最完美的解决方法,时间复杂度可以降低到O(NlogN)
    public int majorityElement1(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }

    //利用TreeMap来进行排序,更新出现频率大小
    public int majorityElement(int[] nums) {
        TreeMap<Integer,Integer> treeMap=new TreeMap<>();
        for(int i=0;i<nums.length;i++){
            if(treeMap.get(nums[i])!=null){
                treeMap.put(nums[i],treeMap.get(nums[i])+1);
            }else {
                treeMap.put(nums[i],1);
            }
        }
        int loc=-1,max=0;
        for(Map.Entry<Integer,Integer> kv:treeMap.entrySet()){
            if(kv.getValue()>max){
                loc=kv.getKey();
                max=kv.getValue();
                if(max>nums.length/2){
                    break;
                }
            }
        }
        return loc;
    }

    @Test
    public void test() {
        int[] nums=new int[]{2,2,1,1,1,2,2};
        System.out.println(majorityElement1(nums));
        System.out.println(majorityElement(nums));
    }
}

  0.3搜索二维矩阵 II

  0.4合并两个有序数组

  0.5鸡蛋掉落

  

1,字符串

  1.1验证回文【以前写过,比较简单】

  给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

2,数组

3,堆、栈与队列

4,链表

5,哈希与映射

6,树

7,排序与检索

8,动态规划

9,图论

10,数学&位运算

11,模拟面试题

猜你喜欢

转载自www.cnblogs.com/Mufasa/p/11563718.html