- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
编辑
最后发现这种“Brute force”的方法是不对的。
所以我又写了两个方法来解决LIS问题。
[代码在最后。]
// Find LIS Brute force.
public static int[] findLIS_BF (int[] givenArray) {
int size = givenArray.length;
int maxLen = Integer.MIN_VALUE;
int prevIndex = 0;
int tempLen = 1;
int head = 0;
for (int tempHead = 0; tempHead < size; tempHead ++) {
prevIndex = tempHead;
tempLen = 1;
for (int subPointer = tempHead + 1; subPointer < size; subPointer ++) {
if (givenArray[prevIndex] <= givenArray[subPointer]) {
prevIndex = subPointer;
tempLen ++;
}
}
if (tempLen > maxLen) {
maxLen = tempLen;
head = tempHead;
}
}
System.out.println("LIS by BF, max len = " + maxLen);
int[] rest = new int[maxLen];
int restIndex = 0;
rest[restIndex] = givenArray[head];
restIndex ++;
prevIndex = head;
for (int i = head + 1; i < size; i ++) {
if (givenArray[prevIndex] <= givenArray[i]) {
rest[restIndex] = givenArray[i];
restIndex ++;
prevIndex = i;
}
}
return rest;
}
public class FindLIS_LCS {
// Find LIS by LCS.
// Time complexity = O(n^2).
// LCS.
// Time complexity = O(n^2).
// Note:
// UP LEFT MARK = -1.
// UP MARK = -2.
// LEFT MARK = -3.
private static int LCS (int[] firstA, int[] secondA, int[][]c, int[][]b) {
int lenFA = firstA.length;
int lenSA = secondA.length;
// Init c matrix.
for (int i = 0; i < lenFA; i ++) c[i][0] = 0;
for (int i = 0; i < lenSA; i ++) c[0][i] = 0;
for (int i = 1; i < lenFA+1; i ++) {
for (int j = 1; j < lenSA+1; j ++) {
if (firstA[i - 1] == secondA[j - 1]) {
c[i][j] = c[i - 1][j - 1] + 1;
b[i - 1][j - 1] = -1;
} else if (c[i - 1][j] >= c[i][j - 1]) {
c[i][j] = c[i - 1][j];
b[i - 1][j - 1] = -2;
} else {
c[i][j] = c[i][j - 1];
b[i - 1][j - 1] = -3;
}
}
}
return c[lenFA][lenSA];
}
// Print out the LCS.
// Time complexity = O(m + n).
private static void printLCS_Helper (int[] firstA, int[][]b, int i, int j) {
if (i < 0 || j < 0) return; // Base case.
if (b[i][j] == -1) {
printLCS_Helper(firstA, b, i - 1, j - 1);
System.out.print(String.format("%-6d", firstA[i]));
} else if (b[i][j] == -2) printLCS_Helper(firstA, b, i - 1, j);
else printLCS_Helper(firstA, b, i, j - 1);
}
public static void printLCS (int[] firstA, int[][]b) {
int size = firstA.length;
printLCS_Helper(firstA, b, size - 1, size - 1);
}
// Quick sort for array.
// Time complexity = O(nlgn).
private static void exchange (int[] givenArray, int firstIndex, int secondIndex) {
int temp = givenArray[firstIndex];
givenArray[firstIndex] = givenArray[secondIndex];
givenArray[secondIndex] = temp;
}
private static int partition (int[] givenArray, int start, int end, int pivotIndex) {
int pivot = givenArray[pivotIndex];
int left = start;
int right = end;
while (left <= right) {
while (givenArray[left] < pivot) left ++;
while (givenArray[right] > pivot) right --;
if (left <= right) {
exchange(givenArray, left, right);
left ++;
right --;
}
}
return left;
}
private static void quickSortFromMinToMax_Helper (int[] givenArray, int start, int end) {
if (start >= end) return; // Base case.
// Generate a random num in the range[start, end] as the pivot index to partition the array.
int rand = start + (int) (Math.random() * ((end - start) + 1));
int split = partition (givenArray, start, end, rand);
// Do recursion.
quickSortFromMinToMax_Helper(givenArray, start, split - 1);
quickSortFromMinToMax_Helper(givenArray, split, end);
}
public static void quickSortFromMinToMax (int[] givenArray) {
int size = givenArray.length;
quickSortFromMinToMax_Helper(givenArray, 0, size - 1);
}
// Copy array.
public static int[] copyArray (int [] givenArray) {
int size = givenArray.length;
int[] newArr = new int[size];
for (int i = 0; i < size; i ++)
newArr[i] = givenArray[i];
return newArr;
}
// Main method to test.
public static void main (String[] args) {
// Test data: {1, 2, 1, 4, 5, 3, 10}.
//int[] givenArray = {1, 2, 1, 4, 5, 3, 10};
int[] givenArray = {2, 1, 6, 3, 5, 4, 8, 7, 9};
int size = givenArray.length;
// Test finding LIS by LCS approach.
int[] sortedArr = copyArray(givenArray);
quickSortFromMinToMax (sortedArr);
int[][]c = new int[size + 1][size + 1];
int[][]b = new int[size][size];
System.out.println("Test max len = " + LCS(givenArray, sortedArr, c, b));
printLCS(givenArray, b);
}
}
[DP+二分查找法]
public class FindLIS {
// Linear search.
public static int linearSearch (int[] givenArray, int key) {
int size = givenArray.length;
for (int i = size - 1; i >= 0; i --) {
if (givenArray[i] >= 0)
if (givenArray[i] < key) return i;
}
return -1;
}
// Find the len of the LIS.(Longest increasing (non-necessarily-adjacent) subsequence).
// DP + Binary search.
// Time complexity = O(nlgn).
// Note:
// This binary search to find the elem's index of the given array, which is less than the elem's value = key.
private static int biSearch (int[] givenArray, int start, int end, int key) {
if (start > end) return -1;
int mid = (start + end) / 2;
if (givenArray[mid] <= key) return mid;
else return biSearch(givenArray, start, mid - 1, key);
}
public static int findLISLen (int[] givenArray) {
int size = givenArray.length;
int maxLen = 1;
int[] memo = new int[size];
for (int i = 0; i < size; i ++) memo[i] = -10;
memo[0] = givenArray[0];
for (int i = 1; i < size; i ++) {
if (givenArray[i] > memo[maxLen - 1]) {
memo[maxLen] = givenArray[i];
maxLen ++;
} else {
// int pos = linearSearch(memo, givenArray[i]); // Using linear search, the time complexity = O(n^2).
int pos = biSearch(memo, 0, maxLen - 1, givenArray[i]); // Using Binary search, the time complexity = O(nlgn).
memo[pos + 1] = givenArray[i];
}
}
// Show memo.
showArray(memo);
return maxLen;
}
// Show array.
public static void showArray (int[] givenArray) {
int size = givenArray.length;
for (int i = 0; i < size; i ++)
System.out.print(String.format("%-6d", givenArray[i]));
System.out.println();
}
// Main method to test.
public static void main (String[] args) {
// Test data: {2, 1, 6, 3, 5, 4, 8, 7, 9}.
//int[] givenArray = {2, 1, 6, 3, 5, 4, 8, 7, 9};
//int[] givenArray = {1, 2, 1, 4, 5, 3, 10};
int[] givenArray = {2, 1, 6, 3, 5, 4, 8, 7, 9};
// Test finding the LIS by DP + Binary search.
System.out.println("Test finding the LIS by DP + Binary search, max len = " + findLISLen(givenArray));
}
}
最佳答案
是的,您的方法和两种 DP 方法的复杂度都是 O(n^2)。对于 O(nlogn) 算法,请参阅 here它还提供了实现。
关于java - (LIS) 最长递增子序列算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970883/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!