算法练习,链表二分

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;

public class BinarySearch {
    public static void main(String[] args) {
        int[] a = { 11, 27, 28, 33 };
        // System.out.println(findFirstRepeat("qywyer23tdd", 11));
        // ListNode head = LinkedListReverse.initialList();
        // LinkedListReverse.printList(insertionSortList(head));[4,5,1,6,2,7,3,8],10
        GetLeastNumbers_Solution(new int[] { 4, 5, 1, 6, 2, 7, 3, 8 }, 10);
    }

    public static ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        int cnt = 0;
        if (k > input.length || k == 0) {
            return list;
        }
        while (cnt < k) {
            list.add(input[cnt]);
            cnt++;
        }
        Collections.sort(list);

        for (int i = k; i < input.length; i++) {
            int num = input[i];
            // 如果超出最大,则不用管,如果没有超出最大,则需要加入并踢出最大
            if (num < list.get(k - 1)) {
                list.remove(k - 1);
                list.add(num);
                Collections.sort(list);
            }
        }
        System.out.println(list);
        return null;
    }

    /**
     * 插入排序 head 1 -> 7 -> 2 -> 6 -> 9 1 -> 2 -> 6 -> 7 -> 9
     */
    public static ListNode insertionSortList(ListNode head) {
        ListNode pstart = head;
        ListNode pcurr = head.next;
        if (pstart == null) {
            return null;
        }
        // //1 7 2 6 9 3 在7后面插入888
        // do {
        // int currVal = pstart.val;
        // if (currVal == 7) {
        // ListNode newNode = new ListNode(888, null);
        // newNode.setNext(pstart.next);
        // pstart.setNext(newNode);
        // }
        // } while ((pstart = pstart.next) != null);

        // 1 7 2 6 9 3 在7前面插入888
        do {
            int currVal = pcurr.val;
            if (currVal == 7) {
                ListNode newNode = new ListNode(888, null);
                newNode.setNext(pcurr);
                pstart.setNext(newNode);
            }
        } while ((pcurr = pcurr.next) != null);
        return head;
    }

    public static char findFirstRepeat(String A, int n) {
        HashSet<Character> hs = new HashSet<Character>();
        for (char c : A.toCharArray()) {
            if (hs.contains(c)) {
                return c;
            } else {
                hs.add(c);
            }
        }
        return ‘ ‘;
    }

    public static int getPos(int[] A, int n, int val) {
        int start = 0;
        int end = n - 1;
        int mid = (end - start) / 2;
        while (start < end) {
            if (A[mid] == val) {
                return mid;
            } else if (A[mid] > val) {
                end = mid;
            } else if (A[mid] < val) {
                start = mid;
            }
            mid = start + (end - start) / 2;
        }
        return 0;
    }
}
时间: 2024-10-07 08:46:39

算法练习,链表二分的相关文章

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

HDU 4004 The Frog&#39;s Games(基本算法-贪心,搜索-二分)

The Frog's Games Problem Description The annual Games in frogs' kingdom started again. The most famous game is the Ironfrog Triathlon. One test in the Ironfrog Triathlon is jumping. This project requires the frog athletes to jump over the river. The

算法学习 - 链表的游标实现~ C++

链表的游标实现,就是用另外一种方法来访问链表,模拟游标. 在我学习的理解中,就是创建一个节点数组,模拟内存的排列,然后从其中来申请内存和释放内存.但是实际的内存没有被释放~ 下面直接贴代码了: // // main.cpp // CursorList // // Created by Alps on 14-7-27. // Copyright (c) 2014年 chen. All rights reserved. // #include <iostream> #define CursorSp

【算法拾遗】二分查找递归非递归实现

转载请注明出处:http://blog.csdn.net/ns_code/article/details/33747953 本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,以下是递归非递归的实现. 非递归实现: /* 非递归实现,返回对应的序号 */ int BinarySearch(int *arr,int len,int key) { if(arr==NULL || len<1) return -1; int low = 0; int high = len-1; while(l

算法——基础篇——二分查找

     二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.     首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

算法:链表

通过链表的一些题目,了解链表的基本操作实现,掌握递归算法的基本思路,掌握扎实的编程习惯. 一.单链表基本操作 1.1.单链表节点定义 struct ListNode { int value; ListNode *pNext; }; 1.2.在尾部插入节点 void AddToTail(ListNode *pHead, int value) { /* * 尾部插入 * 添加空的头结点,简化代码 */ ListNode *node = new ListNode(); node->value = va

C++算法之链表排序的代码

下面的资料是关于C++算法之链表排序的代码. { return; while(curr){ prev = curr; curr = curr->next; insert_for_sort_operation(ppNode, prev); } return; } b)对于待插入的节点,选择合适的位置插入即可 { return; } while(cur){ if(pNode->data < cur->data) break; prev = cur; cur = cur->next