美文网首页
算法|排序

算法|排序

作者: 激扬飞雪 | 来源:发表于2023-02-08 09:32 被阅读0次

148. 排序链表

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    private ListNode mergerList(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(-1);
        ListNode cur = dummy;
        while (l1 != null && l2 != null){
            if (l1.val > l2.val) {
                cur.next = l2;
                l2 = l2.next;
            } else {
                cur.next = l1;
                l1 = l1.next;
            }
            cur = cur.next;
        }
        cur.next = l1 == null ? l2 : l1;
        return dummy.next;
    }
    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode fast = head;
        ListNode slow = head;
        ListNode pre = null;
        while (fast != null && fast.next != null){
            fast = fast.next.next;
            pre = slow;
            slow = slow.next;
        } 
        if (pre != null) pre.next = null;
        ListNode l1 = sortList(head);
        ListNode l2 = sortList(slow);
        return mergerList(l1, l2);
    }
}

179. 最大数

class Solution {
    private void swap(String[] strs, int i, int j) {
        String temp = strs[i];
        strs[i] = strs[j];
        strs[j] = temp;
    }
    private int commpare(String o1, String o2) {
        String str1 = o1 + o2;
        String str2 = o2 + o1;
        return str1.compareTo(str2);
    }
    private int partion(String[] strs, int left, int right) {
        String pv = strs[right];
        int j = left;
        for (int i = left; i < right; i++){
            if (commpare(strs[i], pv) < 0) {
                swap(strs, j, i);
                j++;
            }
        }
        swap(strs, j, right);
        return j;
    }
    private void quickSort(String[] strs, int left, int right) {
        if (left >= right) return;
        int pi = partion(strs, left, right);
        quickSort(strs, left, pi - 1);
        quickSort(strs, pi + 1, right);
    }
    public String largestNumber(int[] nums) {
        String[] strs = new String[nums.length];
        for (int i = 0; i < nums.length; i++){
            strs[i] = nums[i] + "";
        }
        
        quickSort(strs, 0, strs.length - 1);
        StringBuilder res = new StringBuilder();
        for (int i = strs.length - 1; i >= 0; i--) {
            res.append(strs[i]);
        }
        String result = res.toString();
        if (result.charAt(0) == '0') result = "0";
        return result;
    }
}
class Solution {
    public String largestNumber(int[] nums) {
        String[] strs = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            strs[i] = nums[i] + "";
        }
        Arrays.sort(strs, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
        StringBuilder res = new StringBuilder();
        for (String str:strs){
            res.append(str);
        }
        String result = res.toString();
        if (result.charAt(0) == '0') result = "0";
        return result;

    }
}

215. 数组中的第K个最大元素

class Solution {
    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    private int partition(int[] nums, int left, int right) {
        Random random = new Random();
        int ranIndex = random.nextInt(right - left + 1) + left;
        swap(nums, ranIndex, right);
        int pv = nums[right];
        int j = left;
        for (int i = left; i < right; i++){
            if (nums[i] < pv) {
                swap(nums, i, j);
                j++;
            }
        }
        swap(nums, j, right);
        return j;
    }
    private int findKthLargest(int[] nums, int left, int right, int k) {
        if (left == right) return nums[left];
        if (left > right) return -1;
        int pi = partition(nums, left, right);
        if (pi == k) return nums[pi];
        else if (pi > k) return findKthLargest(nums, left, pi - 1, k);
        else return findKthLargest(nums, pi + 1, right, k);
    }
    public int findKthLargest(int[] nums, int k) {
        int length = nums.length;
        return findKthLargest(nums, 0,length - 1, length - k);
    }
}
class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2)-> o1 - o2);
        for (int i = 0; i < nums.length; i++) {
            queue.offer(nums[i]);
            if (queue.size() > k) {
                queue.poll();
            }
        }
        return queue.poll();
    }
}
class Solution {
    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    private int partition(int[] nums, int left, int rigth) {
        Random random = new Random();
        int ranIndex = random.nextInt(rigth - left + 1) + left;
        swap(nums, ranIndex, left);
        int pv = nums[left];
        int i = left; 
        int j = rigth;
        while (i < j) {
            while (i < j && nums[j] > pv) {
                j--;
            }
            while (i < j && nums[i] <= pv) {
                i++;
            }
            swap(nums, i, j);
        }
        swap(nums, left, i);
        return i;   
    }
    private int findKthLargest(int[] nums, int left, int rigth, int k) {
        if (left == rigth) return nums[left];
        if (left > rigth) return -1;
        int pi = partition(nums, left, rigth);
        if (pi == k) return nums[pi];
        else if (pi > k) return findKthLargest(nums, left, pi - 1, k);
        else return findKthLargest(nums, pi + 1, rigth, k);
        
    }
    public int findKthLargest(int[] nums, int k) {
        int length = nums.length;
        return findKthLargest(nums, 0, length - 1, length - k);
    }
}

347. 前 K 个高频元素

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            hashMap.put(nums[i], hashMap.getOrDefault(nums[i], 0) + 1);
        }
        //最小堆
        PriorityQueue<int[]> queue = new PriorityQueue<>((o1, o2)->o1[1] - o2[1]);
        for (Map.Entry<Integer, Integer> entry:hashMap.entrySet()) {
            int key = entry.getKey();
            int value = entry.getValue();
            queue.offer(new int[]{key, value});
            if (queue.size() > k) queue.poll();
        }
        int[] result = new int[k];
        for (int i = result.length - 1; i >= 0; i--) {
            result[i] = queue.poll()[0];
        }
        return result;
    }
}
class Solution {
    private void swap(ArrayList<int[]> list, int i, int j) {
        int[] temp = list.get(i);
        list.set(i, list.get(j));
        list.set(j, temp);
    }
    private int partition(ArrayList<int[]> list, int left, int rigth) {
        Random random = new Random();
        int ranIndex = random.nextInt(rigth - left + 1) + left;
        swap(list, ranIndex, rigth);
        int pv = list.get(rigth)[1];
        int j = left;
        for (int i = left; i < rigth; i++){
            if (list.get(i)[1] < pv) {
                swap(list, i, j);
                j++;
            }
        }
        swap(list, j, rigth);
        return j;
    }
    private int[] topKFrequent(ArrayList<int[]> list, int left, int rigth, int k) {
        if (left == rigth) {
            int[] result = new int[list.size() - k];
            for (int i = 0; i < result.length; i++) {
                result[i] = list.get(left + i)[0];
            }

            return result;
        }
        int pi = partition(list, left, rigth);
        if (pi == k) {
            int[] result = new int[list.size() - k];
            // System.out.println(result.length);
            for (int i = 0; i < result.length; i++) {
                result[i] = list.get(pi  + i)[0];
            }
            return result;
        } else if (pi > k) return topKFrequent(list, left, pi - 1, k);
        else return topKFrequent(list, pi + 1, rigth, k);
    }
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++){
            hashMap.put(nums[i], hashMap.getOrDefault(nums[i], 0) + 1);
        }
        ArrayList<int[]> list = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry:hashMap.entrySet()) {
            list.add(new int[]{entry.getKey(), entry.getValue()});
            // System.out.println(entry.getKey() + " " + entry.getValue());
        }
        int length = list.size();
        return topKFrequent(list, 0, length - 1, length - k);
    }
}

面试题45. 把数组排成最小的数

class Solution {
    public String minNumber(int[] nums) {
        String[] strs = new String[nums.length];
        for (int i = 0; i < strs.length; i++) {
            strs[i] = nums[i] + "";
        }
        Arrays.sort(strs, (o1, o2)->(o1 + o2).compareTo(o2 + o1));
        StringBuilder res = new StringBuilder();
        for (String str:strs) {
            res.append(str);
        }
        String result = res.toString();
        // if (result.charAt(0) == '0') result = "0";
        return result;
    }
}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:算法|排序

      本文链接:https://www.haomeiwen.com/subject/miiohdtx.html